11

Python のグローバル値について混乱しているだけです。ここに 2 つのコードがあります

#gl.py

import cli

a = 1    
print "gl 1: %d %d" % (id(a), a)


def reset():
    global a
    a = 7
    print "reset 1: %d %d" % (id(a), a)


if __name__ == '__main__':
    cli.handler(reset)
    print "gl 2: %d %d" % (id(a), a)

クリコード

#cli.py

def handler(func):
    from gl import a
    print "cli 1: %d %d" % (id(a), a)
    func()
    print "cli 2: %d %d" % (id(a), a)

実行結果は

$ python gl.py
gl 1: 150847672 1
gl 1: 150847672 1
cli 1: 150847672 1
reset 1: 150847600 7
cli 2: 150847672 1    #Why value doesn't change
gl 2: 150847600 7

ここで「function reset()」の実行後、グローバル値の結果が cli.py( cli 2: 150847672 1 ) では変化しないのに、gl.py に戻るとグローバル値が変化することがわかりません!!

4

3 に答える 3

4

ここには2つの概念がありません

  • グローバルはモジュールに対するグローバルであり、モジュール間ではありません

参照: http://legacy.python.org/doc/essays/ppt/hp-training/sld036.htm

参照: http://docs.python.org/release/2.4/ref/global.html

  • 変数は参照ではなく値としてインポートされます

参照: https://stackoverflow.com/a/3338357/977038

モジュール間でグローバル変数を共有する必要がある場合は、モジュール間でグローバル変数を共有するにはどうすればよいですか? を参照してください。

于 2013-03-06T06:32:38.890 に答える
2

cli でインポートする gl は、実際にはモジュール オブジェクトのコピーです。次のようにコードを変更すると:

#gl.py

import cli
import sys

a = 1    
print "gl 1: %d %d" % (id(a), a)
print "gl id on import: {0}".format(id(sys.modules[__name__]))


def reset():
    global a
    a = 7
    print "gl id in reset: {0}".format(id(sys.modules[__name__]))
    print "reset 1: %d %d" % (id(a), a)

def printa():
    print "gl: %d %d" % (id(a), a)

if __name__ == '__main__':
    cli.handler(reset)
    print "gl id in main: {0}".format(id(sys.modules[__name__]))
    print "gl 2: %d %d" % (id(a), a)

#cli.py

def handler(func):
    #from gl import a
    import gl
    print "gl id in cli: {0}".format(id(gl))
    print "cli 1: %d %d" % (id(gl.a), gl.a)
    func()
    print "cli 2: %d %d" % (id(gl.a), gl.a)
        gl.reset()
        print "cli 3: %d %d" % (id(gl.a), gl.a)

我々が得る:

gl 1: 19056568 1
gl id on import: 140075849968728
gl 1: 19056568 1
gl id on import: 20004096
gl id in cli: 20004096
cli 1: 19056568 1
gl id in reset: 140075849968728
reset 1: 19056424 7
cli 2: 19056568 1
gl id in reset: 20004096
reset 1: 19056424 7
cli 3: 19056424 7
gl id in main: 140075849968728
gl 2: 19056424 7

したがって、リセットを実行すると、参照が変更されます

a -> 19056568

a -> 19056424

ただし、1 つの gl コピーのみです。もう 1 つ (cli のもの) は、古いリファレンスを保持しています。cli 内から gl.reset() を実行すると、そのコピーの参照が変更され、cli で期待される変更が得られます。

于 2013-03-06T06:57:23.043 に答える
2

モジュールglが 2 つの異なる名前空間に 2 回インポートされている

これを試して:

import sys
print sys.modules['__main__'].a
print sys.modules['gl'].a
于 2013-03-06T06:32:06.333 に答える