3

重複の可能性:
Pythonの「驚き最小の原則」:可変のデフォルト引数

私はこのコードを持っています

class Test(object):
  def __init__(self, var1=[]):
    self._var1 = var1

t1 = Test()
t2 = Test()

t1._var1.append([1])

print t2._var1

結果として「[[1]]」が表示されます。したがって、明らかにt1._var1とt2._var1は同じリストをアドレス指定しています。入れたら

t3 = Test()
print t3._var1

次に、「[[1]]」も取得します。したがって、var1=[]はvar1をいくつかのリストに永続的にバインドしているようです。リストをコピーしてみました、

def __init__(self, var1=copy([])):

しかし、同じ結果が得られたため、名前付き引数の式は、initが呼び出される前に評価されたように見え、var1に空のリストのコピーが与えられ、インスタンス間で共有されました。

では、名前付き引数のデフォルト値として[]を使用するにはどうすればよいですか?

4

1 に答える 1

7

[]各オブジェクトに空のリストを持たせたい場合は、直接使用することはできません。私は回避策を使用する傾向があります:

def __init__(self, var1=None):
    if var1 is None:
        var1 = []
    ....

当然、これはvar1可能であれば機能しませんNone。別のオブジェクトを使用する必要があります。

于 2012-11-20T23:42:07.443 に答える