我是该语言的新手,对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版本工作不同?
答案 0 :(得分:1)
执行此操作时,您正在修改对象a
:
a.x = a.x + 1
执行此操作时,您正在更改变量b
所指的内容:
b = b + 1
换句话说,以上代码中b
和x
之间有很大的区别: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的第一个元素指向的位置。