当我使用切片来迭代列表时,我得到了正确的输出。
代码:
words = ['cat', 'window', 'defenestrate']
for w in words[:]:
if len(w) > 6:
words.insert(0, w)
print(words) 输出:
['defenestrate', 'cat', 'window', 'defenestrate']但是,当我不使用切片进行迭代时,输出会进入无限循环。
代码:
words = ['cat', 'window', 'defenestrate']
for w in words:
if len(w) > 6:
words.insert(0, w)
print(w)谁能解释为什么会出现这样的问题?
发布于 2019-09-24 00:55:10
这是因为切片创建了一个新对象。
以下是这些代码的工作原理:
第一个:
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[:]时,它就像是在做:
temp = words.copy()
for w in temp:
...要理解第二个代码的作用,可以运行以下代码:
words = ['cat', 'window', 'defenestrate']
for w in words:
print(words, w)
if len(w) > 6:
words.insert(0, w)
i += 1
if i == 15: break 这将为您提供以下输出:
['cat', 'window', 'defenestrate'] cat
['cat', 'window', 'defenestrate'] window
['cat', 'window', 'defenestrate'] defenestrate
['defenestrate', 'cat', 'window', 'defenestrate'] defenestrate
['defenestrate', 'defenestrate', 'cat', 'window', 'defenestrate'] defenestrate
['defenestrate', 'defenestrate', 'defenestrate', 'cat', 'window', 'defenestrate'] defenestrate
.
.
.在第三次迭代之后,for循环看到它已经向上迭代,直到word array的第三个元素,然后转到第四个元素。这也是defenestrate,所以它读取它,并将它添加到数组的开头,所以数组的长度变为5,同样的事情会一次又一次地发生。
发布于 2019-09-24 00:55:43
这是因为在遍历列表之前,切片会创建该列表的副本。当您插入到您正在迭代的列表中时,您正在添加更多要迭代的元素。
发布于 2019-09-24 00:55:59
因为在第一种情况下,切片的效果是将您正在循环的列表固定到原始列表。
在第二种情况下,您继续向列表中添加新元素,因此循环变得没有终点。
https://stackoverflow.com/questions/58066930
复制相似问题