我有一个列表,我想将相同的元素附加到它自己。
myList = [1,2,3]
使用for...range进行此操作是可以的:
for i in range(len(myList)):
myList.append(myList[i])
print(myList) # [1,2,3,1,2,3]
但是使用for...in会导致无限循环:
for i in myList:
myList.append(i)
# infinite loop
为什么会这样呢?我猜想in range(len(myList))
只计算一次,但是in myList
每一次迭代都要重新评估?这就是蟒蛇的工作方式吗?
发布于 2021-10-23 01:38:46
他们都被评估过一次。问题是,myList
是一个可变的对象,列表迭代器不会复制列表,这意味着只要在循环中添加项,迭代器总是有一个新的值来产生。
range(len(myList))
计算为range(3)
。这个range对象不知道列表,而且当它改变大小时,它不会改变范围(因为range对象在Python中是不可变的)。
如果您希望遍历您计划进行变异的列表,一个更好的选择是复制该列表:
for item in myList[:]:
myList.append(item)
副本不会发生变异,因此它只能运行有限的次数。
正如Ghost Ops所提到的,将列表的元素附加到其本身的最佳方法是myList.extend(myList)
。
发布于 2021-10-23 01:31:28
for i in myList
将对myList
中的每个元素重复。当您继续在每次迭代中将元素附加到myList
时(并且循环是用每个迭代来计算的),它将永远重复。
发布于 2021-10-23 01:42:19
这是因为循环将持续到检查每个item in mylist
。但是mylist
没有结束,因为循环总是在其中附加一些项。当您使用len()
方法时,它总是固定的值,所以这就是为什么len()
方法循环不是无限的。但是当您使用item in mylist
时,mylist
中的项每次都会被追加,这就是为什么循环将永远持续。
https://stackoverflow.com/questions/69686813
复制相似问题