我模糊理解Python是按值分配的。有没有一种方法可以通过引用分配python变量?因此,在下面的示例中,它实际上将oa更改为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
Run Code Online (Sandbox Code Playgroud)
简单的答案是python中的所有变量都是引用。一些引用是针对不可变的对象(例如字符串,整数等),而某些引用是针对可变的对象(列表,集合)。更改引用对象的值(例如添加到现有列表)和更改引用(更改变量以引用完全不同的列表)之间存在细微的区别。
在您的示例中,您最初x = o.a是将变量x作为对任何变量的引用o.a(对的引用1)。然后x = 2,您将更改x引用(现在引用2,但o.a仍引用)1。
关于内存管理的简短说明:
Python为您处理所有这一切的内存管理,因此,如果您执行以下操作:
x = "Really_long_string" * 99999
x = "Short string"
Run Code Online (Sandbox Code Playgroud)
当第二条语句执行时,Python将注意到不再有对“真正长字符串”字符串对象的引用,它将被销毁/取消分配。