2013-07-14 25 views
-1

我不明白我的代碼的輸出如下所示。我希望看到:對象之間的Python變量分隔

1 
1 

而是看到:

1 
2 

這是使用Python 2.7.3有問題的代碼:

#!/usr/bin/python 

class Test: 
    __tBin = {'80':0, '70':0, '60':0, '50':0,'40':0, 
       '30':0, '20':0, '10':0, '0':0, 
       '-10':0, '-20':0, '-30':0, '-40':0} 

    def __init__(self): 
     self.__tests = {'i2c_transfer':self.__tBin} 

    def foo(self): 
     self.__tests['i2c_transfer']['80'] += 1 
     print self.__tests['i2c_transfer']['80'] 

if __name__ == "__main__": 
    testList = list() 
    for i in range(1, 3): 
     testList.append(Test()) 

    for i in testList: 
     i.foo() 

感謝

+2

你爲什麼期待? '__tBin'是一個* class *屬性,第一次調用'foo'會修改它,這就是爲什麼你第二次看到'2'。在你的'__init__'中,它看起來像你想對它進行拷貝*,但你必須明確地做到:''ic2_transfer':self .__ tBin.copy()' – Bakuriu

+0

啊,謝謝。就像我在下面說的,這是我第一次使用Python,我想我沒有看足夠的文檔,這就是爲什麼我會期待我的想法。 +1 – psidhu

回答

2

當您創建字典__tBin,你實際上創建它爲對象,而不是作爲實例對象。所以當你做self.__tests['i2c_transfer']['80'] += 1時,這個新值在整個類的每個實例中都會持續存在。所以如果你想改變它:

class Test: 
    def __init__(self): 
     self.__tBin = {'80':0, '70':0, '60':0, '50':0,'40':0, 
        '30':0, '20':0, '10':0, '0':0, 
        '-10':0, '-20':0, '-30':0, '-40':0} 
     self.__tests = {'i2c_transfer':self.__tBin} 

你應該得到你要找的。 self.__ tBin將字典實例化爲實例對象,因此每次實例化類時都會重置該字典。

+0

啊,謝謝你,這是我第一次使用Python,從來沒有意識到dict的。 – psidhu

+0

樂於幫忙。請記住,這不是關於_dict_,而是關於課程。當您創建沒有self前置的屬性時,該屬性將成爲類屬性。因此,無論何時修改類屬性,該修改都會通過該類的所有實例持續存在,而不管該屬性是什麼。 – pswaminathan