这段代码来自Python的文档。我有点困惑。
words = ['cat', 'window', 'defenestrate']
for w in words[:]:
if len(w) > 6:
words.insert(0, w)
print(words)
以下是我最初的想法:
words = ['cat', 'window', 'defenestrate']
for w in words:
if len(w) > 6:
words.insert(0, w)
print(words)
为什么这段代码创建了一个无限循环,而第一个没有?
发布于 2017-06-19 23:05:17
words[:]
将words
中的所有元素复制到一个新列表中。所以当你遍历words[:]
时,你实际上是在遍历words
当前拥有的所有元素。因此,当您修改words
时,这些修改的效果在words[:]
中不可见(因为您在开始修改words
之前调用了words[:]
)
在后一个示例中,您正在迭代words
,这意味着您对words
所做的任何更改对于您的迭代器都是可见的。因此,当您在words
的索引0中插入时,您会将words
中的每个其他元素“提升”一个索引。因此,当您继续执行for循环的下一次迭代时,您将获得words
的下一个索引处的元素,但这只是您刚才看到的元素(因为您在列表的开头插入了一个元素,将所有其他元素向上移动了一个索引)。
要查看实际效果,请尝试以下代码:
words = ['cat', 'window', 'defenestrate']
for w in words:
print("The list is:", words)
print("I am looking at this word:", w)
if len(w) > 6:
print("inserting", w)
words.insert(0, w)
print("the list now looks like this:", words)
print(words)
发布于 2017-06-19 23:04:44
(除了@Coldspeed answer)
请看下面的示例:
words = ['cat', 'window', 'defenestrate']
words2 = words
words2 is words
结果:True
这意味着名称word
和words2
指的是同一个对象。
words = ['cat', 'window', 'defenestrate']
words2 = words[:]
words2 is words
结果:False
在本例中,我们创建了新对象。
https://stackoverflow.com/questions/44633798
复制相似问题