0

サンプルコードは次のとおりです。

def foo():
    def bar():
        foobar = 'foobaz'

    foobar = 'foobar'
    print foobar
    bar()
    print foobar

foo()

関数によってfoobar内部の変数を変更したい。上記のコードは機能しません。これは、insideがinとは別の名前空間にあるためです。簡単な回避策は、グローバルを作成し、両方を持ち、それにアクセスできるようにすることですが、もっと簡単な回避策があることを願っています。foobarfoobarbarfoobarfoofoobarfoobar

4

5 に答える 5

2

nonlocal3.xに存在するキーワードを探しています。

def f():
    x = None
    def g():
        nonlocal x
        x = 1

2.xで立ち往生している場合は、リストまたは同様の可変データコンテナを用意し、回避策としてそれにアクセスすることでそれを行うことができます。

def f():
    x = [None]
    def g():
        x[0] = 1

これは、変数がスコープに含まれるときに機能しますが、スコープから漏れることはありません。可変オブジェクトを使用すると、スコープ内でそれらを変更でき、それらの変更は伝播されます。

于 2012-11-03T19:43:24.520 に答える
2

python 3.xでは使用できnonlocal、python2.xでは関数属性を使用してみてください。

def foo():
    def bar():
        foo.foobar = 'foobaz'  #change the function attribute

    foo.foobar = 'foobar'     #declare as function attribute
    print foo.foobar
    bar()
    print foo.foobar
foo() 

出力:

foobar
foobaz
于 2012-11-03T19:51:37.753 に答える
1

Python2.7では不可能です。Python 3の場合:

def foo():
    def bar():
        nonlocal foobar
        foobar = 'foobaz'

    foobar = 'foobar'
    print foobar
    bar()
    print foobar

foo()

2.xでは、次のことができます。

def foo():
    foobar = []
    def bar():
        foobar[0] = 'foobaz'

    foobar[0] = 'foobar'
    print foobar[0]
    bar()
    print foobar[0]

foo()
于 2012-11-03T19:43:39.410 に答える
0
def foo():
    def bar():
        foobar = 'foobaz'
        return foobar

    foobar = 'foobar'
    print foobar
    foobar = bar()
    print foobar

foo()
于 2012-11-03T19:45:52.760 に答える
0

関数はすでにPythonのファーストクラスのオブジェクトですが、独自の「関数」または関数オブジェクトを次のように作成できます。

class Foo(object):
    def bar(self):
        self.foobar = 'foobaz'

    def __call__(self):
        self.foobar = 'foobar'
        print self.foobar
        self.bar()
        print self.foobar

foo = Foo()
foo()
于 2012-11-03T20:53:32.660 に答える