Python for循环是通过引用工作的吗?

Jam*_*mes 23 python

for在Python中使用循环迭代列表中的项时,是否会更改item(下面)更改相应的项items

for item in items:
    item += 1
Run Code Online (Sandbox Code Playgroud)

项目中的每个项目是否会增加或保持与循环之前相同?

[注意:我对Python 2.7和3.x感兴趣]

Mar*_*ers 18

不,Python中的变量不是指针.

它们引用堆上的对象,并且分配给变量不会更改引用的对象,而是更改变量.变量和对象就像绑在气球上的标签; 赋值将标签转换为另一个气球.

看到我之前的这个答案,探索气球和标签的想法.

也就是说,一些对象类型实现了特定的就地添加行为.如果对象是可变的(气球本身可以改变),则就地添加可以被解释为突变而不是赋值.

因此,对于整数,item += 1实际上是item = item + 1因为整数是不可变的.您必须创建一个新的整数对象并将item标签绑定到该新对象.

另一方面,列表可变的并且lst += [other, items]实现为a lst.__iadd__([other, items])并且改变lst气球本身.仍然会进行赋值,但它是同一对象的重新分配,因为该.__iadd__()方法只返回self而不是新对象.我们最终将标签重新绑定到同一个气球上.

循环只是为您提供每次迭代时列表中下一项的引用.它不允许您更改原始列表本身(这只是另一组气球标签); 相反,它为每个包含的项目提供了一个新标签.


Inb*_*ose 7

嗯,这真的取决于项目.

采取以下案例:

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
Run Code Online (Sandbox Code Playgroud)

在这种情况下:

l2 = [1,2,3]

for item in l2:
    item += 1

for item in l2:
    print item

>>> 
1
2
3
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,你需要理解Martijn所说的指针.

  • 这不正确; 您没有分配给局部变量,而是分配给另一个对象上的属性.这是改变可变对象,而不是局部变量. (2认同)