Python:对象列表与整数行为列表

时间:2018-09-01 22:08:46

标签: python list reference

我是该语言的新手,对Python的引用我有些困惑。

考虑以下代码:

class A:
  def __init__(self, x):
    self.x = x

a = A(3)
v=[a]
print(f'obj before: v[0].x={v[0].x}')
a.x = a.x + 1
print(f'obj after:  v[0].x={v[0].x}')

b = 3
w=[b]
print(f'int before: w[0]={w[0]}')
b = b + 1
print(f'int after:  w[0]={w[0]}')

===================== 输出:

obj before: v[0].x=3
obj after:  v[0].x=4
int before: w[0]=3
int after:  w[0]=3

为什么代码的obj和int版本工作不同?

2 个答案:

答案 0 :(得分:1)

执行此操作时,您正在修改对象a

a.x = a.x + 1

执行此操作时,您正在更改变量b所指的内容:

b = b + 1

换句话说,以上代码中bx之间有很大的区别:b是变量,x是{{1 }}。

为变量分配内容不会修改任何对象,因此仅影响对其进行分配的变量 * ,而设置属性值会修改对象,这可以看出在引用该对象的任何变量中。


* refcounts的变化也会影响垃圾收集器,但现在不相关了。

答案 1 :(得分:1)

  

a = A(3)

变量a指向对象。

  

v = [a]

v的第一个元素指向同一对象。

  

a.x = a.x + 1

更改对象的属性“ x”。

v仍然包含相同的对象,但是其属性已更改。

  

b = 3

变量b指向对象3。

  

w = [b]

w的第一个元素也指向对象3。

  

b = b +1

b现在指向对对象3和对象1(即对象4)进行加法运算时得到的结果。

w仍然包含对象3。您从未更改此对象的任何属性,也从未更改w的第一个元素指向的位置。

相关问题