2024-04-20 03:51:41 发布
网友
我在Python上尝试了以下代码,得到的结果是: 似乎我试图通过改变元素来改变iterables,但这并不奏效。在
lis = [1,2,3,4,5] for elem in lis: elem = 3 print lis [1, 2, 3, 4, 5]
但是,如果iterable是具有自己方法的对象(如列表),则可以在for循环中修改它们。在
在for循环中,“elem”项到底是什么?提前谢谢!在
for
这不起作用的原因是你误解了elem是什么。它不是对象本身,甚至称它为“变量”是不正确的。在
elem
它是一个名称,有点像标签,指向对象。如果你直接在它上面赋值,你只需要重写名字来指向其他东西。但是,您仍然拥有对列表的原始引用,因此在elem上分配不同的值不会修改lis本身。在
lis
现在,在本例中,由于elem指向的所有对象都是整数,因此您甚至根本无法更改它们,因为整数(以及许多其他类型,如字符串或元组)是不可变的。这意味着,简单地说,一旦对象被创建,它就不能被修改。它与它们是否“有方法”无关(所有Python对象都包含方法和整数),而是它们是否是不可变的。在
然而,有些对象是可变的,这意味着它们是可以改变的。列表就是此类对象的示例。在第二个示例中,elem是一个引用lis中包含的列表对象的名称,这些对象本身是可变的。这就是为什么在适当的地方修改它们(使用.append(),或者.remove()等)可以很好地工作。在
.append()
.remove()
您的for循环中的elem变量是对每次迭代中当前对象的引用。更改它不会做任何事情;它只会更改变量elem的值,而且在下一次循环中,它将被更改。要实际更改列表中元素的值,需要引用列表和要更改的元素的索引,但没有后者。在
所以你想做的是这样:
for index, elem in enumerate(lis): lis[index] = 3
这样一来,elem代表元素的值,index代表列表中的位置。它使您不必不断地编写lis[index]来获取值,但是对于更改元素,您仍然必须这样做。在
index
lis[index]
您还可以执行以下操作:
然而,在大多数情况下,这被认为是非python的(在其他情况下,如果列表在迭代时变长或变短会发生什么情况)?在
在这里,您实际上是在修改第二个示例中的list对象。在第一个示例中,不是修改数字,而是替换它。对于Python的新用户来说,这可能是一个复杂的细微差别。在
看看这个:
>>> x = 1 >>> id(x) 4351668456 >>> x = 2 >>> id(x) 4351668432
id返回对象的标识符。正如您在上面看到的,x的对象在这两次都发生了变化。在
id
x
在这里,我修改了列表,所以这个列表仍然是原始对象y。在
y
所以,所有这些都意味着当你在做elem = 3时,它不是在修改它,而是在替换它。到现在为止,它不再与列表关联。在
elem = 3
这是你可以做你想做的事情的方法之一。这将获取索引,然后修改列表,而不是数字。在
这不起作用的原因是你误解了
elem
是什么。它不是对象本身,甚至称它为“变量”是不正确的。在它是一个名称,有点像标签,指向对象。如果你直接在它上面赋值,你只需要重写名字来指向其他东西。但是,您仍然拥有对列表的原始引用,因此在
elem
上分配不同的值不会修改lis
本身。在现在,在本例中,由于
elem
指向的所有对象都是整数,因此您甚至根本无法更改它们,因为整数(以及许多其他类型,如字符串或元组)是不可变的。这意味着,简单地说,一旦对象被创建,它就不能被修改。它与它们是否“有方法”无关(所有Python对象都包含方法和整数),而是它们是否是不可变的。在然而,有些对象是可变的,这意味着它们是可以改变的。列表就是此类对象的示例。在第二个示例中,
elem
是一个引用lis
中包含的列表对象的名称,这些对象本身是可变的。这就是为什么在适当的地方修改它们(使用.append()
,或者.remove()
等)可以很好地工作。在您的
for
循环中的elem
变量是对每次迭代中当前对象的引用。更改它不会做任何事情;它只会更改变量elem
的值,而且在下一次循环中,它将被更改。要实际更改列表中元素的值,需要引用列表和要更改的元素的索引,但没有后者。在所以你想做的是这样:
这样一来,
elem
代表元素的值,index
代表列表中的位置。它使您不必不断地编写lis[index]
来获取值,但是对于更改元素,您仍然必须这样做。在您还可以执行以下操作:
^{pr2}$然而,在大多数情况下,这被认为是非python的(在其他情况下,如果列表在迭代时变长或变短会发生什么情况)?在
在这里,您实际上是在修改第二个示例中的list对象。在第一个示例中,不是修改数字,而是替换它。对于Python的新用户来说,这可能是一个复杂的细微差别。在
看看这个:
^{pr2}$id
返回对象的标识符。正如您在上面看到的,x
的对象在这两次都发生了变化。在在这里,我修改了列表,所以这个列表仍然是原始对象
y
。在所以,所有这些都意味着当你在做
elem = 3
时,它不是在修改它,而是在替换它。到现在为止,它不再与列表关联。在这是你可以做你想做的事情的方法之一。这将获取索引,然后修改列表,而不是数字。在
^{3}$相关问题 更多 >
编程相关推荐