2014-09-03 173 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