我的模糊理解是python按价值分配。有没有办法通过引用分配python变量?那么,在下面的例子中,它实际上会将o.a改为2?
class myClass():
def __init__(self):
self.a = 1
def __str__(self):
_s = ''
for att in vars(self):
_s += '%s, %s' %(att, getattr(self,att))
return _s
o = myClass()
x = o.a
x = 2
print o
答案 0 :(得分:4)
简单的答案是python中的所有变量都是引用。一些引用是不可变对象(如字符串,整数等),一些引用是可变对象(列表,集合)。更改引用对象的值(例如添加到现有列表)和更改引用(更改变量以引用完全不同的列表)之间存在细微差别。
在您的示例中,您最初x = o.a
使变量x
成为o.a
的引用(对1
的引用)。当您执行x = 2
时,您正在更改x引用(现在引用2
,但o.a
仍然引用1
。
关于内存管理的简短说明:
Python会为您处理所有这些内存管理,所以如果您执行以下操作:
x = "Really_long_string" * 99999
x = "Short string"
当第二个语句执行时,Python会发现没有更多对“真正长字符串”字符串对象的引用,它将被销毁/解除分配。
答案 1 :(得分:1)
实际上,这取决于类型。整数,浮点数,字符串等是不可变的,例如对象的实例是可变的。
你无法改变这一点。
如果你想改变o.a,你需要写:
o.a = 2
在你的情况下
x = 2
只创建一个值为2的新变量,它与&x; x = o.a'无关。上面的陈述(意思是最后一个陈述没有效果)。
可行的是:
x = o
这将引用o。 而不是说
x.a = 2
这也将改变o.a,因为x和o将引用同一个实例。