在 Python for 循环中,迭代变量是引用吗?它可以用于更改底层数据吗?
- 2025-02-27 09:05:00
- admin 原创
- 101
问题描述:
当使用for
Python 中的循环来迭代列表中的项目时,更改item
(下面)是否会更改中的相应项目items
?
for item in items:
item += 1
items 中的每个项目都会增加还是保持与循环之前相同?
解决方案 1:
不,Python 中的变量不是指针。
它们引用的是堆上的对象,赋值给变量不会改变引用的对象,而是改变变量。变量和对象就像绑在气球上的标签;赋值会将标签重新绑定到另一个气球上。
请参阅我之前的回答,进一步探讨有关气球和标签的想法。
话虽如此,一些对象类型实现了特定的就地添加行为。如果对象是可变的(气球本身可以改变),那么就地添加可以被解释为突变而不是赋值。
因此,对于整数来说,item += 1
实际上与相同,item = item + 1
因为整数是不可变的。您必须创建一个新的整数对象并将item
标签绑定到该新对象。
另一方面,列表是可变的,并且lst += [other, items]
被实现为lst.__iadd__([other, items])
改变lst
气球本身的。仍然会进行分配,但它是对同一对象的重新分配.__iadd__()
,因为该方法只是返回self
而不是新对象。我们最终将标签重新绑定到同一个气球上。
循环只是在每次迭代时为您提供对列表中下一个项目的引用。它不允许您更改原始列表本身(那只是另一组气球标签);相反,它为所包含的每个项目提供新标签。
解决方案 2:
嗯,这确实取决于物品。
请看以下案例:
class test():
pass
a = test()
a.value = 1
b = test()
b.value = 2
l = [a,b]
for item in l:
item.value += 1
for item in l:
print item.value
>>>
2
3
在这种情况下:
l2 = [1,2,3]
for item in l2:
item += 1
for item in l2:
print item
>>>
1
2
3
所以正如您所看到的,您需要理解Martijn所说的指针。
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD