0

Pythonでの自己変数の使い方について質問があります。次の例を見てください。

from copy import deepcopy
class IntClass:
    props = {}
    def __init__(self, keys, values):
        indx = 0
        for key in keys:
            self.props[key] = values[indx]
            indx += 1
def display(self):
    for key in self.props.keys():
        print 'key=%s value=%s' %(key,self.props[key])

class IntGen:
    def gen(self, keys, values):
        for vs in values:
            yield [keys, vs]

    def start(self, keys, values):
        self.loader = self.gen(keys, values)

    def nextItem(self):
        return self.loader.next()

keys = ['k1', 'k2', 'k3']
values = [['v1.1', 'v1.2', 'v1.3'], ['v2.1', 'v2.2', 'v2.3'], ['v3.1', 'v3.2', 'v3.3']]

holder = []
intGen = IntGen()
intGen.start(keys, values)
while True:
    try:
        a = intGen.nextItem()
        holder.append(deepcopy(IntClass(a[0],a[1])))
    except StopIteration:
        break

for h in holder:
    h.display()

私の理解では、結果は次のようになります。

key=k3 value=v3.3
key=k2 value=v3.2
key=k1 value=v3.1
key=k3 value=v2.3
key=k2 value=v2.2
key=k1 value=v2.1
key=k3 value=v1.3
key=k2 value=v1.2
key=k1 value=v1.1

しかし、私が得たものは次のとおりです。

key=k3 value=v3.3
key=k2 value=v3.2
key=k1 value=v3.1
key=k3 value=v3.3
key=k2 value=v3.2
key=k1 value=v3.1
key=k3 value=v3.3
key=k2 value=v3.2
key=k1 value=v3.1

While ループ内で、IntClass の新しいインスタンスを作成しようとすると、その新しいインスタンスが、前のループで作成されたインスタンスの props 属性に格納されている値を変更したように思えます。同じデータを持つすべてのインスタンス。

誰でも私に答えを教えてもらえますか?自己変数に何か問題があるように見えますが、それを修正する方法については接着剤がありません。

どうもありがとう、

4

1 に答える 1

2

props = {}クラス定義に直接行を入れます。これにより、クラスのすべてのインスタンスが同じ辞書を共有します。

各インスタンスに独自の辞書が必要な場合はself.props = {}__init__代わりに入れます。

于 2012-05-17T10:55:22.433 に答える