2013-03-20 47 views
0

我使用Python 2.7.2獲得了一些奇怪的行爲。通過其他類持續存在的類成員

如果我有類的字典,那麼這些類中的任何列表將通過包含字典中的所有類實例保持相同的值。

這將解釋我的意思:

>>> class FooBar(): 
    somelist = [] 


>>> someFooBars = {} 
>>> someFooBars["key1"] = FooBar() 
>>> someFooBars["key2"] = FooBar() 
>>> someFooBars["key3"] = FooBar() 
>>> someFooBars["key1"].somelist.append("Hello") 
>>> someFooBars["key1"].somelist 
['Hello'] 
>>> someFooBars["key2"].somelist 
['Hello'] 
>>> someFooBars["key1"].somelist.append("World!") 
>>> someFooBars["key3"].somelist 
['Hello', 'World!'] 

正如你所看到的,我已經填補了字典中的FooBar三個實例,用繩子鍵,但一旦我添加對象somelist,對象也在另一個FooBar s。

這不是我期望發生的事情(我期望它們是分開的),但顯然有一個原因 - 請解釋這個原因是什麼,爲什麼會發生這種情況,以及如何修復它。 謝謝!

+0

或這一個:http://stackoverflow.com/questions/15489567/all-instances-of-a-class-have-the-same-dict-as-an-attribute-in-python-3-2 – mgilson 2013-03-20 19:28:09

+0

@PavelAnossov:你是對的,我很抱歉做了一個重複的事情 - 我事先做了搜索,但我顯然沒有使用正確的術語。 – Jishaxe 2013-03-20 19:31:35

+0

你會在我的答案中找到精確的解釋:(http://stackoverflow.com/a/15467310/551449) – eyquem 2013-03-20 20:07:12

回答

1

你現在擁有什麼樣的「靜態」成員。爲了實現「實例」構件行爲,添加__init__方法(用作「構造」):

class FooBar(): 
    def __init__(self): 
     self.somelist = [] 
+0

解決了我的問題。謝謝! – Jishaxe 2013-03-20 19:29:11

1

somelist是一個類變量,所以它是爲每個實例相同。

+0

感謝您進一步澄清這一點。我以前使用C++/Java的經驗讓我感到不安。 – Jishaxe 2013-03-20 19:30:18

相關問題