2013-07-15 5 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을 볼 수는 있습니다. 특히 사전에 명시 적으로 'copy()'를 할 때 그 이유를 알아낼 수 없습니다.

이 난 단지 (즉, 비 재귀) 사본 얕은에 의해 복사

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

변수 info에서 파이썬 2.7.4

+0

xml 또는 html을 구문 분석하는 경우 lxml 및 etree를 권장합니다. – Mai

답변

1

중첩 된 데이터 구조의 경우 얕은 복사본 대신 딥 복사본을 만들어야합니다. 여기를 참조하십시오 : http://docs.python.org/2/library/copy.html

파일의 시작 부분에 copy을 가져옵니다. 그런 다음 info.copy()과 같은 전화를 copy.deepcopy(info)으로 바꿉니다. 좋아요 :

#!/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

에있어. __tBin 및 친구를 복사하려면 여기 copy.deepcopy을 사용해야합니다.