2014-03-30 93 views
0

Python中列表的奇怪附加。Python中列表的追加

在這裏,我定義的類

class test: 
    group = [] 
    def __init__(self,name): 
    self.name = str(name) 

然後我寫那些

test0 = test(0) 
test1 = test(1) 
test_list = [test0, test1] 

我要救test1.nametest0.group

test_list[0].group.append(test_list[1].name) 

我打印test0.group,這是[」 1'],一切正常。 但是當我要救test0.name到test1.group

test_list[1].group.append(test_list[0].name) 

然後我打印test1.group,這是['1','0']。我不知道爲什麼它不是['0']? 順便說一句,在這裏我打印test0.group,這也是['1','0']

回答

0

這是因爲group變量是類test的所有實例共享的變量,因此test0test1共享相同的組。當你做第一個附加,即'1'它是好的,但是當你做第二個附加時,你追加到相同的列表,因此它變成['1', '0']。實際上,如果您打印test0.group作爲代碼的最後一行,則會看到它也是['1', '0'],因爲它們是相同的變量。我不確定你想要達到什麼效果,但是如果你想要單獨的組,那麼你應該使它們變爲self.group,並將它們移動到__init__方法中。如果你可以改變你的問題,我可以幫你用實際上試圖實現。

+0

你的答案很簡短,但非常有用。無論如何,我已經解決了問題〜 – Ma233

0

我相信這個問題是在類定義:

class test: 
    group = [] 
    def __init__(self,name): 
    self.name = str(name) 

在這一點上,__init__方法不執行任何操作,並self.name = str(name)不會被調用。您需要縮進self.name = str(name)才能使其位於__init__的身體中。試試這個:

class test: 
    group = [] 
    def __init__(self,name): 
     self.name = str(name) 
+0

謝謝,縮進錯誤是我編輯問題時的錯誤。 – Ma233

0

這與here中討論的基本相同的問題。

令人驚訝嗎?當你定義類時,Python解釋器執行類字段。然後,如果您創建了該類的新實例,則不會執行類字段。所以只有在定義類時纔會執行一次類字段。像:

class someClass: 
    someVar = 0  #<---This class field is executed once 
    def __init__(self): 
     pass 

好的。現在你定義了類。接下來創建該類的新實例。像:

instance1 = someClass() 
instance2 = someClass() 

這將創造新的記憶和someClass複製數據。 現在instance1instance2不共享內存空間。他們擁有自己獨立的內存空間。所以instance1.someVarinstance2.someVar有不同的內存空間。但是0instance1.someVar0instance2.someVar是完全相同的對象(0在同一個內存空間)。你可以確保它做這樣:

​​

所以,你可以找到0完全是同一個對象。

這不是唯一的情況下,當someClass.someVar = 0。當您使用[]替換0時,也會發生同樣的情況。


回到您的代碼。你可以簡單地會出現你的問題做這樣的:

class test: 
    group = [] 
    def __init__(self,name): 
     self.name = str(name) 

test0 = test(0) 
test1 = test(1) 

test0.group.append(100) 

print test0.group 
print test1.group 
#[100] 
#[100] 
#will be printed 

這是因爲test0.grouptest1.group點相同的對象。像:

+-----------+ 
|test0.group|------+ 
+-----------+  | 
        v 
       +-------+ 
       | [] | 
       +-------+ 
       ^
+-----------+  | 
|test1.group|------+ 
+-----------+ 

當你執行test0.group.append(100),它變得像:

+-----------+ 
|test0.group|------+ 
+-----------+  | 
        v 
       +-------+ 
       | [100] | 
       +-------+ 
       ^
+-----------+  | 
|test1.group|------+ 
+-----------+ 

您也可以設置另一個對象。像:

test1.group = "123" 

然後test1.group變得像:

+-----------+ 
|test0.group|------+ 
+-----------+  | 
        v 
       +-------+ 
       | [100] | 
       +-------+ 

+-----------+  +-----+ 
|test1.group|------>|"123"| 
+-----------+  +-----+ 

對不起,我的英語不好。我希望它有幫助。 :)

+0

非常感謝您爲您的患者帶來了新的一面。^_ ^ – Ma233