2013-07-15 177 views
2

我試圖創建一個結構,它可以很好地解析日誌文件。我首先嚐試將字典設置爲類對象,但由於我將它們設置爲類屬性,因此這不起作用。Python兩個字典內的另一個字典內的另一個字典

我現在嘗試以下設置我的結構:

#!/usr/bin/python 
class Test: 
    def __init__(self): 
     __tBin = {'80':0, '70':0, '60':0, '50':0,'40':0} 
     __pBin = {} 
     __results = list() 
     info = {'tBin' : __tBin.copy(), 
       'pBin' : __pBin.copy(), 
       'results': __results} 

     self.writeBuffer = list() 
     self.errorBuffer = list() 

     self.__tests = {'test1' : info.copy(), 
         'test2' : info.copy(), 
         'test3' : info.copy()} 

    def test(self): 
     self.__tests['test1']['tBin']['80'] += 1 
     self.__tests['test2']['tBin']['80'] += 1 
     self.__tests['test3']['tBin']['80'] += 1 
     print "test1: " + str(self.__tests['test1']['tBin']['80']) 
     print "test2: " + str(self.__tests['test2']['tBin']['80']) 
     print "test3: " + str(self.__tests['test3']['tBin']['80']) 

Test().test() 

我來這裏的目的是創建兩個字典對象(__tBin和__pBin),使它們的副本,每個測試(即TEST1 TEST2 TEST3 ...)。但是,我感覺到test1,test2和test3在我明確地製作它們的副本時仍然具有相同的值。上面的代碼還包括我如何測試我試圖完成的任務。

雖然我希望看到1,1,1印,我看到3,3,3,我想不通爲什麼,尤其是當我明確地做一個「副本()」在字典。

我關於Python 2.7.4

+0

如果你解析xml或html,我會推薦lxml和etree。 – Mai

回答

1

對於嵌套數據結構,你需要做的,而不是淺複製深拷貝。 請參閱:http://docs.python.org/2/library/copy.html

將文件的開頭導入模塊copy。然後用copy.deepcopy(info)替換info.copy()等電話。像這樣:

#!/usr/bin/python 

import copy 

class Test: 
    def __init__(self): 
     ... 
     info = {'tBin' : __tBin.copy(), 
       'pBin' : __pBin.copy(), 
       'results': __results} 
     ... 
     self.__tests = {'test1' : copy.deepcopy(info), 
         'test2' : copy.deepcopy(info), 
         'test3' : copy.deepcopy(info)} 

    def test(self): 
     ... 

... 
+0

我明白了,謝謝。所以填充信息字典時我們不需要深層複製的原因是因爲__tBin或__pBin不包含更多的對象,而信息字典卻沒有,因此我們需要執行遞歸複製,對嗎? – psidhu

+0

是的。但請記住,簡單的深層複製並不總是您想要的。例如,如果在對象內部有實例變量指向不應複製的對象,則不希望遞歸複製它們。我提供的鏈接提供了可用於更深入瞭解整個問題的其他信息。 – qzr

1

self.__tests = {'test1' : info.copy(), 
        'test2' : info.copy(), 
        'test3' : info.copy()} 

變量info僅由淺複製(即非遞歸)副本。如果你想__tBin和朋友被複制,你應該在這裏使用copy.deepcopy

相關問題