2

ログファイルの解析に適した構造を作成しようとしています。最初に辞書をクラスオブジェクトとして設定しようとしましたが、クラス属性にしたためうまくいきません。

現在、構造をセットアップするために次のことを試みています。

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

ここでの目的は、2 つの辞書オブジェクト (__tBin と __pBin) を作成し、各テスト (つまり、test1 test2 test3...) に対してそれらのコピーを作成することです。ただし、test1、test2、および test3 は、明示的にコピーを作成しているように感じると、まだ同じ値を共有していることを経験しています。上記のコードには、私が達成しようとしていることをテストする方法も含まれています。

1, 1, 1 が印刷されることを期待していますが、3, 3, 3 が表示され、特に辞書で明示的に 'copy()' を実行すると、理由がわかりません。

私はPython 2.7.4を使用しています

4

2 に答える 2

1

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

変数infoは、浅い (つまり、非再帰的な) コピーによってのみコピーされます。友達をコピーしcopy.deepcopyたい場合は、ここを使用してください。__tBin

于 2013-07-15T18:19:25.457 に答える
1

ネストされたデータ構造の場合、浅いコピーではなく深いコピーを作成する必要があります。ここを参照してください: http://docs.python.org/2/library/copy.html

copyファイルの先頭でモジュールをインポートします。info.copy()次に、呼び出し likeを に置き換えます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):
        ...

...
于 2013-07-15T18:19:58.270 に答える