有什么区别?< 表示列表中的项目><对于范围(len(list))中的 i>


>>> n = [1, 2, 3]
>>> for item in n:
...     item *= 2
...
>>> print n
[1, 2, 3]

我希望上述代码的结果是 [2, 4, 6],而显然不是。然后我尝试如下for i in range(n)

>>> n = [1, 2, 3]
>>> for i in range(len(n)):
...     n[i] *= 2
... 
>>> 
>>> n
[2, 4, 6]

这似乎没问题。我的问题是,这两种for循环方法之间的本质区别是什么?是什么原因导致上述意外结果?

如果有帮助,第一个循环等效于:

for i in range(len(n)):
   item = n[i]
   item *= 2

换句话说,它首先将item绑定到列表的第i个元素,然后将其重新绑定到一个新对象,该对象的值是第 i 个元素的两倍。它不会更改列表的任何元素。

实现此循环的一个好方法是使用列表推导:

n = [item * 2 for item in n]

不能修改表示当前小版本的对象。
好吧,实际上,您可以,但它不会更改列表中保存的对象。

这两种 for 循环方法之间的本质区别是什么?

在第一个示例中,您遍历列表中的对象(并尝试直接修改该对象 - 它不会更改列表的元素本身(。
然后,您遍历第二个示例中的整数列表(并实际修改给定列表的元素,因此您修改了列表内容(。

item只是一个本地名称。它最初由 for 循环分配以指向当前元素,但如果将其重新分配为指向其他元素,则对原始元素没有影响。

但是,如果使用索引引用原始列表中的元素,则可以更改该列表以包含不同的值。

for item in lst 中没有赋值。您正在对对象本身进行操作,该对象是不可变的,因此当您执行*=调用时,它只会为您创建一个新对象,将其分配给item,然后在循环的下一次迭代中将其丢弃。

当您执行for i in range(len(lst))时,您将新对象分配给lst的第i个元素。

最新更新