2012-12-11 92 views
3

我從考試下面的代碼,我不明白爲什麼第一次當你做出f2 = f1,做f1.set()改變f2但在那之後,當你設置f1 = Foo("Nine", "Ten")不會改變f2可言。如果有人知道爲什麼請向我解釋。非常感謝!蟒蛇 - 類可變性

代碼:

class Foo(): 
    def __init__(self, x=1, y=2, z=3): 
     self.nums = [x, y, z] 

    def __str__(self): 
     return str(self.nums) 

    def set(self, x): 
     self.nums = x 

f1 = Foo() 
f2 = Foo("One", "Two") 

f2 = f1 
f1.set(["Four", "Five", "Six"]) 
print f1 
print f2 

f1 = Foo("Nine", "Ten") 
print f1 
print f2 

f1.set(["Eleven", "Twelve"]) 
print f1 
print f2 

結果:

['Four', 'Five', 'Six'] 
['Four', 'Five', 'Six'] 
['Nine', 'Ten', 3] 
['Four', 'Five', 'Six'] 
['Eleven', 'Twelve'] 
['Four', 'Five', 'Six'] 
+3

你現在正在參加考試嗎? – Woot4Moo

+1

這是我的這個老答案嗎? [Python列表不反映變量更改,新的python](http://stackoverflow.com/questions/12080552/12080644#12080644) –

+2

嘗試運行此代碼通過可視化在[Python導師](http:// www .pythontutor.com)。 – Marius

回答

5
f2 = f1 

這種說法既f1f2是的Foo相同實例引用後。因此,一個變化會影響另一個。

f1 = Foo("Nine", "Ten") 

在此之後,f1被分配到如此f1f2以任何方式不再連接Foo實例 - 所以人會其他效果的變化。