2013-07-15 246 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

相关问题