2016-02-19 39 views
2

因此Python不是我的強項,我遇到了我認爲是一個奇怪的問題。我已經將問題簡化爲幾行代碼,簡化它以使問題更容易。我有對象的列表,這個對象:Python:添加到列表中的一個對象的字典更改列表中的每個其他對象的所有字典

class FinalRecord(): 
    ruid = 0 
    drugs = {} 

我在shell創建他們是這樣的:當我想改變藥物快譯通一個對象

finalRecords = [] 
fr = FinalRecord() 
fr.ruid = 7 
finalRecords.append(fr) 
fr2 = FinalRecord() 
fr2.ruid = 10 
finalRecords.append(fr2) 

,它改變它對於另一隻也

finalRecords[0].drugs["Avonex"] = "Found" 

我打印出來的:

finalRecords[1].drugs 

它表明:

{'Avonex':'Found'} 

當我期待它實際上是空的。我知道我並不完全理解Python如何處理這些對象,任何人都可以幫我解決這個問題嗎?

回答

3

原因是因爲drugs是一個類屬性。所以如果你改變一個對象,它實際上會改變其他對象。

如果您希望沒有此行爲,那麼您正在查找實例屬性。集藥品在__init__這樣的:

class FinalRecord(): 
    def __init__(self): 
     self.ruid = 0 
     self.drugs = {} 

拿筆記使用self,這是你的對象的引用。

這裏是class vs instance attributes

一些信息那麼,說明這種行爲完全演示:

>>> class FinalRecord(): 
...  def __init__(self): 
...   self.ruid = 0 
...   self.drugs = {} 
... 
>>> obj1 = FinalRecord() 
>>> obj2 = FinalRecord() 
>>> obj1.drugs['stuff'] = 2 
>>> print(obj1.drugs) 
{'stuff': 2} 
>>> print(obj2.drugs) 
{} 
+1

啊,我明白,我沒有並不完全理解Python在Python中的工作方式 –

+1

在類範圍聲明的基本方法(def關鍵字)和變量(從class關鍵字中提取一級)定義了dict中的元素離奇的,那本字典是你的班級。一些元素是函數(def),其他元素是類字段。一旦你獲得了Python的動態特性,許多事情就會一次變得有意義。 –

+1

@SpencerSutton:你應該考慮接受這個答案,如果它真的幫助你解決了你的問題。 – ray

1

您定義drugs作爲屬性,而不是一個實例屬性。正因爲如此,你總是在修改同一個對象。您應該在__init__方法中定義drugs。我也建議使用ruid作爲參數:

class FinalRecord(): 
    def __init__(self, ruid): 
     self.ruid = ruid 
     self.drugs = {} 

然後,它可以被用作這樣的:

fr = FinalRecord(7) 
finalRecords.append(fr) 
fr2 = FinalRecord(10) 
finalRecords.append(fr2) 

或者更簡單地說:

finalRecords.append(FinalRecord(7)) 
finalRecords.append(FinalRecord(10)) 
相關問題