2

予期しない問題が発生したとき、Pythonでいくつかの作業を行っていました。クラスがあり、2つの変数xとyがあります。xとyは、それぞれが独自のデータを持つクラスの個別のコピーであることを意味します。そこで、xをクラスに等しく設定し、それにいくつかの値を与えてから、yでも同じことを行います。ただし、そのデータを使用しようとすると、xの値を上書きしたことに気付きます。使用するクラスの2つの別々のコピーを作成したのではなく、同じクラスへの2つの参照を作成したようです。したがって、コードの一般的な例は次のとおりです。

x = someClass()
x.set(2, 0)
y = someClass()
y.set(3, 0)
print(x)

最終的には、2ではなく3が出力されます。変数ごとに異なるデータを保持するために、クラスの個別の「バージョン」を作成したいと思います。しかし、その方法についてはよくわかりません。Python3.3を使用します。クラスのコードは次のとおりです。

class someClass:
    def __init__(self, list = [0,0,0,0,0,0,0,0,0,0]):
        self.list = list
    def __repr__(self):
        return str(self.list)
    def set(self, loc, val):
        if ((loc >= 0) & (loc <= 9)):
            self.list[loc] = val
4

1 に答える 1

7

Python の一般的な初心者の罠に陥りました。リストをデフォルト変数として使用することはdef __init__(self, list = [0,0,0,0,0,0,0,0,0,0])、そのクラスのすべてのインスタンスがその引数の値と同じリスト インスタンスを共有することを意味します。「最小の驚き」と変更可能なデフォルト引数も参照してください

ちなみに、リストなどのコンテナ オブジェクトをデフォルトの引数として使用する場合の一般的なイディオムは、代わりにそれを使用Noneしてチェックすることです。例えば:

def __init__(self, values=None):
    if values is None:
        values = [0] * 10

または何でも。デフォルトの引数ほど明確に自己文書化するわけではありませんが、機能します。

補足として、変数名として使用しないでください。 list(やや一般的に使用される)list組み込みを隠します。

于 2012-11-14T23:59:53.303 に答える