有什么区别?< for item in list> 和 <for i in range(len(list))>
What's the difference?< for item in list> and <for i in range(len(list))>
>>> 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
循环方法之间的本质区别是什么?是什么导致了上述意外结果?
您不能修改表示当前迭代的对象。
好吧,实际上,您可以,但它不会更改列表中保存的对象。
what's the essential difference between these two for loop method?
您在第一个示例中遍历列表中的对象(并尝试直接修改所述对象 - 它不会更改列表的元素本身)。
你在第二个例子中迭代了整数列表(实际上修改了给定列表的元素,所以你修改了列表内容)。
如果有帮助,第一个循环相当于:
for i in range(len(n)):
item = n[i]
item *= 2
换句话说,它首先将 item
绑定到列表的第 i
个元素,然后将其重新绑定到一个新对象,该对象的值是 [=13= 的两倍]-th 元素。它不会更改列表的任何元素。
实现此循环的一个好方法是使用列表理解:
n = [item * 2 for item in n]
item
只是一个本地名称。它最初由 for 循环指定为指向当前元素,但如果您将其重新指定为指向其他内容,则对原始元素没有影响。
但是如果您使用索引来引用原始列表中的元素,则可以改变该列表以包含不同的值。
for item in lst
中没有 作业。你在对象本身上操作,它是不可变的,所以它只是在你调用 *=
时为你创建一个新对象,将它分配给 item
,然后在下一次迭代时将其丢弃循环。
当您执行 for i in range(len(lst))
时,您 将新对象分配给 的第 i
个元素lst
.
>>> 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
循环方法之间的本质区别是什么?是什么导致了上述意外结果?
您不能修改表示当前迭代的对象。
好吧,实际上,您可以,但它不会更改列表中保存的对象。
what's the essential difference between these two for loop method?
您在第一个示例中遍历列表中的对象(并尝试直接修改所述对象 - 它不会更改列表的元素本身)。
你在第二个例子中迭代了整数列表(实际上修改了给定列表的元素,所以你修改了列表内容)。
如果有帮助,第一个循环相当于:
for i in range(len(n)):
item = n[i]
item *= 2
换句话说,它首先将 item
绑定到列表的第 i
个元素,然后将其重新绑定到一个新对象,该对象的值是 [=13= 的两倍]-th 元素。它不会更改列表的任何元素。
实现此循环的一个好方法是使用列表理解:
n = [item * 2 for item in n]
item
只是一个本地名称。它最初由 for 循环指定为指向当前元素,但如果您将其重新指定为指向其他内容,则对原始元素没有影响。
但是如果您使用索引来引用原始列表中的元素,则可以改变该列表以包含不同的值。
for item in lst
中没有 作业。你在对象本身上操作,它是不可变的,所以它只是在你调用 *=
时为你创建一个新对象,将它分配给 item
,然后在下一次迭代时将其丢弃循环。
当您执行 for i in range(len(lst))
时,您 将新对象分配给 的第 i
个元素lst
.