为什么当我向循环传递复制的列表时,我的循环会返回一个空列表错误,而原始列表却没有错误?[已结束]

Why does my loop return an empty list error when I pass it a copied list, but does not error with an original list? [closed]

提问人:Steven Torman 提问时间:7/30/2022 最后编辑:John KugelmanSteven Torman 更新时间:7/30/2022 访问量:359

问:


这个问题是由一个错别字或一个无法再重现的问题引起的。虽然类似的问题可能在这里成为主题,但这个问题的解决方式不太可能帮助未来的读者。

去年关闭。

short_texts = ['I like the apple', 'I like the orange as well', 'Finally, I like the inside of a kiwi the best']
sent_messages = []


def send_messages(messages):
    
    while messages:
        popped_st = short_texts.pop(0)
        print(popped_st)
        sent_messages.append(popped_st)


send_messages(short_texts[:])

print(short_texts)
print(sent_messages)

错误>

I like the apple
    I like the orange as well
    Finally, I like the inside of a kiwi the best
    Traceback (most recent call last):
      File "C:\Users\Steve\Documents\python_work\8.11.py", line 13, in <module>
        send_messages(short_texts[:])
      File "C:\Users\Steve\Documents\python_work\8.11.py", line 8, in send_messages
        popped_st = short_texts.pop(0)
    IndexError: pop from empty list
    [Finished in 200ms]

如果我去掉函数调用的 slice 参数,程序就会工作。添加切片会导致“从空列表中弹出”。

我正在阅读 Python 速成课程 2E,在练习 8.10.py 中,它要求我将初始列表的副本传递给函数并打印附加列表和原始列表。

显然我在这里没有掌握一个概念?

python 循环 while-loop slice empty-list

评论

0赞 Andrej Kesely 7/30/2022
您会收到错误,因为 的计算结果始终为 。IndexError: pop from empty listwhile messages:True
1赞 Barmar 7/30/2022
messages是 的副本。所以不修改,循环是无限的。short_textsshort_texts.pop()messages
0赞 Karl Knechtel 7/30/2022
“它要求我将初始列表的副本传递给函数,并打印附加列表和原始列表。”那么,您认为应该弹出哪个列表 - 原件还是副本?为什么?为了控制循环,应该检查哪个列表的长度 - 原始列表还是副本?为什么?你为什么认为这本书要你复制这个列表?如果从副本中删除元素,您是否希望原始元素的长度会发生变化,反之亦然?为什么?因此,为什么当项目从原始副本中删除时,“直到副本为空”的循环会停止?

答:

0赞 Barmar 7/30/2022 #1

你没有在循环中修改,所以条件永远不会改变,你有一个无限循环。你应该从 中弹出,而不是 。然后最终会变为空,条件将为 false,循环停止。messageswhile messages:messagesshort_textsmessageswhile messages:

def send_messages(messages):
    while messages:
        popped_st = messages.pop(0)
        print(popped_st)
        sent_messages.append(popped_st)

当您不使用切片来调用函数时,它会起作用,因为然后引用相同的列表。在这种情况下,等价于 。切片将创建列表的副本。messagesshort_textsshort_texts.pop(0)messages.pop(0)