2014-09-03 28 views
4

python按值赋值是我的模糊理解。有没有办法让python变量通过引用分配?那么,在下面的例子中,它实际上将o.a更改为2?如何在python中引用变量?

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 

回答

4

简单的答案是python中的所有变量都是引用。一些引用是不可变对象(如字符串,整数等),一些引用是可变对象(列表,集合)。改变引用对象的值(如添加到现有列表)和更改引用(更改变量以引用完全不同的列表)之间存在细微差别。

在你的例子中,你最初是x = o.a使变量xo.a是(参考1)的引用。当你那么做x = 2,你所作出的修改X引用(它现在引用2,但o.a仍然引用1

对内存管理的一个短信:

的Python处理这一切的内存管理你,所以如果你做这样的事情:

x = "Really_long_string" * 99999 
x = "Short string" 

当第二个语句执行,Python会注意到有以“真的很长的字符串”字符串对象的更多引用,它的Wi将被销毁/释放。

+0

所以,我认为现在有办法让x对o.a的引用而不是o.a的值呢? – chrise 2014-09-03 10:07:26

+0

只要o.a发生变化,就没有办法让x发生变化,除非让它们都指向同一个可变对象(例如,一个列表),然后修改该对象(例如,更改该列表的内容)。 – 2014-09-03 11:52:57

1

其实它取决于类型。整数,浮点数,字符串等是不可变的,例如对象的实例是可变的。

你不能改变这一点。

如果你想改变OA你需要写:

o.a = 2 

在你的情况

x = 2 

使只是一个新的变量,值2和无关的“X = OA”上面的陈述(意味着最后的陈述没有效果)。

什么工作是:

x = o 

这将使邻的参考。 而不是说

x.a = 2 

这也将改变o.a因为X和O将引用同一个实例。

+3

我认为甚至包含字符串,整数等变量实际上是对这些类型的对象的引用。例如。 '>>> a =“a”; >>> a2 =“a”; >>> a是a2;真' – 2014-09-03 08:58:07

+5

整数,浮点数和字符串通过引用进行分配;他们恰好是不可变的 – BluePeppers 2014-09-03 08:58:12

+0

感谢您的快速响应 – chrise 2014-09-03 09:00:25