如何使用延迟初始化来共享全局变量?

3

也许这是一个非常初级的问题,但是每次都让我困惑...

有人能解释一下为什么以下代码会输出"None"吗?

test1.py

test = None

def init():
    global test
    test = 1

test2.py

from test1 import test, init

# test1.test should be getting a value here
init()
# I expect test to be a reference to test1.test 
# but behaves like a copy on import-time ?!
print(test)

如果你不使用 from,它会起作用。例如,在 test2.py 中只需执行 import test1,然后引用 test1.test - undefined
我也对这个很好奇,但是应该在初始化调用和声明测试时进行测试更改,而测试值应该发生变化。 - undefined
2个回答

2
当您使用from test1 import test时,您在本地范围内创建了一个变量,该变量绑定到test1.test的值。将值分配给test将用新值替换它,但原始的test1.test仍将保持不变。因此,在您的情况下,当您在test2.py中调用init()时,它实际上使用的是test1.test变量,而不是本地范围内的变量。
>>> import test1
>>> from test1 import test, init

>>> init()
>>> print(test)
None
>>> print(test1.test)
1

请注意,正如在他的回答中所写的那样,当您使用可变数据类型(如列表或字典)时情况是不同的,因为修改它确实会影响原始变量。我的答案基于ThiefMaster在类似问题上的答案。您可以查看它以获取更详细的解释。

2

通过执行test = 1,您正在更改test的引用,但是先前的引用(指向None已经test2.py中导入。如果您想保留它,您可以使用对象来实现:

# test1.py
test = {}

def init():
    # you do not need `global` since you are not rewriting the variable
    test['x'] = 1

# test2.py
from test1 import init, test

assert test == {}
init()
assert test['x'] == 1  # works

我假设问题是为什么赋值会改变引用(但也许这是一个更加新手的问题 :) ) - undefined
1
这就是Python的工作方式,每个变量只是一个名称,用来指定内存中的一个对象。赋值意味着你让该名称指定其他东西,但是已经指向同一先前对象的其他变量保持不变。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接