10

Pythonのクロージャがその名前空間の変数を操作することは可能かどうか疑問に思っています。クロージャ自体の外部で状態が変更されているため、これを副作用と呼ぶ場合があります。こんなことしたい

def closureMaker():
  x = 0
  def closure():
    x+=1
    print x
  return closure

a = closureMaker()
a()
1
a()
2

明らかに私がやりたいことはもっと複雑ですが、この例は私が話していることを示しています。

4

2 に答える 2

17

Python 2.xでそれを正確に行うことはできませんが、トリックを使用して同じ効果を得ることができます。リストなどの可変オブジェクトを使用します。

def closureMaker():
    x = [0]
    def closure():
        x[0] += 1
        print x[0]
    return closure

xを名前付き属性を持つオブジェクトまたは辞書にすることもできます。これは、特に変更する変数が複数ある場合は、リストよりも読みやすくなります。

nonlocal xPython 3.xでは、内部関数に追加する必要があります。これにより、割り当てxは外部スコープに移動します。

于 2011-07-03T23:47:06.413 に答える
5

言語Xのクロージャと比較して、Pythonのクロージャにはどのような制限がありますか?

Python2.xの非ローカルキーワード

例:

def closureMaker():
     x = 0
     def closure():
         nonlocal x
         x += 1
         print(x)
     return closure
于 2011-07-04T00:03:01.787 に答える