4

Python で with..as 構造を使用して、「可逆コンピューティング」コードを簡単に記述できるようにしようとしています。ただし、@contextmanagerクラス メソッドで使用すると、将来のクラス インスタンスのデフォルトの初期化が変更されるようです。Python 2.6 と 3.1 の動作は同じです。この動作を示す簡単な例を次に示します。

#!/usr/bin/env python

import contextlib

class SymList:
    def __init__(self, L=[]):
        self.L = L

    @contextlib.contextmanager
    def SymAdd(self, a):
        self.L.append(a)
        yield
        self.L.append(a)

SL = SymList()
with SL.SymAdd(3):
    SL.L.append(5)
print(SL.L) # Expect and see [3, 5, 3]
SL2 = SymList()
print(SL2.L) # Expect [] and see [3, 5, 3]


  • SL2の新しいインスタンスではないのはなぜSymListですか?
  • データ メンバーはデータ メンバーをどのようにSL2.L参照していSL.Lますか?
4

1 に答える 1

14

この動作は、Pythonで可変のデフォルト引数がどのように機能するかによるものです。

SymList.__init__()次のように変更してみてください。

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

1つのインスタンスで変更すると、に渡されるself.Lも変更されるため、コードの結果は、インスタンスが最初に初期化されたときにすべてのインスタンスが同じ属性を共有することです。LSymList.__init__()L

于 2012-08-07T16:09:49.980 に答える