Python如何迭代for循环?

2024-04-20 03:51:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Python上尝试了以下代码,得到的结果是: 似乎我试图通过改变元素来改变iterables,但这并不奏效。在

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

print lis
[1, 2, 3, 4, 5]

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

^{pr2}$

for循环中,“elem”项到底是什么?提前谢谢!在


Tags: 对象方法代码in元素列表foriterable
3条回答

这不起作用的原因是你误解了elem是什么。它不是对象本身,甚至称它为“变量”是不正确的。在

它是一个名称,有点像标签,指向对象。如果你直接在它上面赋值,你只需要重写名字来指向其他东西。但是,您仍然拥有对列表的原始引用,因此在elem上分配不同的值不会修改lis本身。在

现在,在本例中,由于elem指向的所有对象都是整数,因此您甚至根本无法更改它们,因为整数(以及许多其他类型,如字符串或元组)是不可变的。这意味着,简单地说,一旦对象被创建,它就不能被修改。它与它们是否“有方法”无关(所有Python对象都包含方法和整数),而是它们是否是不可变的。在

然而,有些对象是可变的,这意味着它们是可以改变的。列表就是此类对象的示例。在第二个示例中,elem是一个引用lis中包含的列表对象的名称,这些对象本身是可变的。这就是为什么在适当的地方修改它们(使用.append(),或者.remove()等)可以很好地工作。在

您的for循环中的elem变量是对每次迭代中当前对象的引用。更改它不会做任何事情;它只会更改变量elem的值,而且在下一次循环中,它将被更改。要实际更改列表中元素的值,需要引用列表和要更改的元素的索引,但没有后者。在

所以你想做的是这样:

for index, elem in enumerate(lis):
    lis[index] = 3

这样一来,elem代表元素的值,index代表列表中的位置。它使您不必不断地编写lis[index]来获取值,但是对于更改元素,您仍然必须这样做。在

您还可以执行以下操作:

^{pr2}$

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

在这里,您实际上是在修改第二个示例中的list对象。在第一个示例中,不是修改数字,而是替换它。对于Python的新用户来说,这可能是一个复杂的细微差别。在

看看这个:

>>> x = 1
>>> id(x)
4351668456
>>> x = 2
>>> id(x)
4351668432

id返回对象的标识符。正如您在上面看到的,x的对象在这两次都发生了变化。在

^{pr2}$

在这里,我修改了列表,所以这个列表仍然是原始对象y。在

所以,所有这些都意味着当你在做elem = 3时,它不是在修改它,而是在替换它。到现在为止,它不再与列表关联。在

这是你可以做你想做的事情的方法之一。这将获取索引,然后修改列表,而不是数字。在

^{3}$

相关问题 更多 >