有什么区别?&lt;对于列表中的项目&gt;和<for i =“”in =“”range(len(list))=“”> </for>

时间:2015-02-17 16:48:24

标签: python loops for-loop

>>> 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循环方法之间的本质区别是什么?导致上述意外结果的原因是什么?

4 个答案:

答案 0 :(得分:2)

如果有帮助,第一个循环相当于:

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

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

实现此循环的一种好方法是使用列表解析:

n = [item * 2 for item in n]

答案 1 :(得分:0)

您无法修改代表当前迭代的对象 嗯,实际上,你可以,但它不会改变列表中的对象。

  

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

for item in lst中没有 作业 。你正在操作对象本身,这是不可变的,所以它只是在你进行*=调用时为你创建一个新对象,将它分配给item,然后在下一次迭代时抛弃它循环。

执行for i in range(len(lst))后,您 新对象分配给i的{​​{1}}元素。