Python如何迭代for循环?

tur*_*oup 6 python loops for-loop

我在Python上尝试了以下代码,这就是我所得到的:似乎我尝试通过更改elem来对迭代进行许多更改,但它不起作用.

lis = [1,2,3,4,5]
for elem in lis:
    elem = 3

print lis
[1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

但是,如果迭代物是具有自己的方法(如列表)的对象,则可以在for循环中修改它们.

lis = [[1],[2]]
for elem in lis:
    elem.append(8)

print lis
    [[1, 8], [2, 8]]
Run Code Online (Sandbox Code Playgroud)

for循环中究竟什么是"elem"术语?提前致谢!

voi*_*hos 9

这不起作用的原因是因为你误解了elem 什么.它不是对象本身,将它称为"变量"甚至都不正确.

它是一个名称,有点像标签,指向对象.如果你只是直接分配它,你只需要覆盖名称以指向别的东西.但是,您仍然具有对列表的原始引用,因此分配不同的值elem不会自行修改lis.

现在,在这种情况下,因为所有elem指向的对象都是整数,所以你根本无法更改它们 - 因为整数(以及许多其他类型,如字符串或元组)是不可变的.这意味着,简单地说,一旦创建了对象,它就无法修改.它与它们是否"有方法"无关(所有Python对象都包含方法,包括整数),而与它们是否是不可变的无关.

但是,有些对象是可变的,这意味着它们可以被更改.列表是此类对象的示例.在第二个示例中,elem是一个引用其中包含的列表对象的名称lis,它们本身是可变的.这就是为什么就地修改它们(使用.append()或者.remove()等)可以正常工作的原因.


kin*_*all 5

循环中的elem变量for是每次迭代时对当前对象的引用.改变它不会做任何事情; 它只会改变变量的值,elem并且无论如何都会在下次循环时改变.要实际更改列表中元素的值,您需要对列表的引用和要更改的元素的索引,并且您没有后者.

所以你想要做的是这样的:

for index, elem in enumerate(lis):
    lis[index] = 3
Run Code Online (Sandbox Code Playgroud)

这样就可以获得elem元素的值和index列表中的位置.它可以避免您lis[index]不断编写以获取值,但您仍必须这样做才能更改元素.

你也可以这样做:

for index in xrange(len(lis)):
    lis[index] = 3
Run Code Online (Sandbox Code Playgroud)

但是,在大多数情况下,这被认为是非Pythonic(除其他外,如果列表在迭代时变长或变短,会发生什么)?