1

numpy 配列である Attribute フィールドを持つクラスがあります。クラスには、同じクラスの新しいインスタンスを生成する能力があります。今私の問題は、このように作成されたすべてのインスタンスが同じフィールド属性を指しているように見えることです。したがって、指定されたコードの期待される出力が次の場合:

[0, 0]

[1, 0]

[0, 2]

それは実際に与えます:

[1、2]

[1、2]

[1、2]

その後、a.field のエントリを変更すると、すべてのインスタンスのフィールド属性でエントリが変更されます

これを回避する方法や、ここで理解する上で何が間違っているのか、誰かが考えましたか?

import numpy as np

class A:
    def __init__(self, field=np.zeros(2)):
        self.field=field

    def setField(self, c, index):
        if index<len(self.field):
            self.field[index]=c


    def multiply(self):

        new_A=np.empty(2, dtype=object)

        for n in range(0, 2, 1):
            new_A[n]=A()
            new_A[n].setField(n+1, n)

        return new_A



a=A()

subs=a.multiply()

print a.field
print subs[0].field
print subs[1].field
4

2 に答える 2

1

これは、Python を学習するときに誰もが遭遇する一般的な「落とし穴」です。特にnumpyとは関係ありません。たとえば、通常のリストでも同じ動作が得られます。

>>> def f(x=[]):
...     x.append(1)
...     return x
... 
>>> f()
[1]
>>> f()
[1, 1]
>>> f()
[1, 1, 1]

大まかに、そのコードは次のように解釈されます。

f_default_arg_x = []
def f(x=f_default_arg_x):
    x.append(1)
    return x

この問題が存在することに気付いたら、問題を説明し、それに対して何をすべきかを説明する多くのページを見つけることができます。(例: http://effbot.org/zone/default-values.htm )

通常の解決策はNone、「デフォルト値を提供してください」のプレースホルダーとして使用することです。

def f(x=None):
    if x is None:
        x = []
    x.append(1)
    return x
于 2014-09-16T23:00:51.387 に答える