这是一个有趣的。使用以下内容创建文件foo.py
:
OPTIONS = {'x': 0}
def get_option(key):
from foo import OPTIONS
return OPTIONS[key]
if __name__ == '__main__':
OPTIONS['x'] = 1
print("OPTIONS['x'] is %d" % OPTIONS['x'])
print("get_option('x') is %d" % get_option('x'))
运行python foo.py
会得到以下输出:
OPTIONS['x'] is 1
get_option('x') is 0
在这两种情况下,我都希望结果为1
。为什么在第二种情况下0
?
答案 0 :(得分:2)
您收到此消息是因为from foo import OPTIONS
函数中的get_options()
行在值为的内存中加载了一个新的本地 OPTIONS 变量{ 'X':0} 。但是如果您删除/评论该行,那么您得到了预期结果,这是因为get_options()
中的 OPTIONS 变量现在是全局变量,而不是本地
OPTIONS = {'x': 0}
def get_option(key):
# from foo import OPTIONS
return OPTIONS[key]
if __name__ == '__main__':
OPTIONS['x'] = 1
print("OPTIONS['x'] is %d" % OPTIONS['x'])
print("get_option('x') is %d" % get_option('x'))
您也可以使用id()函数调试它,该函数在其生命周期内返回对象的“身份”。
为此,调试代码为:
OPTIONS = {'x': 0}
def get_option(key):
from foo import OPTIONS
print("Id is %d in get_option" % id(OPTIONS))
return OPTIONS[key]
if __name__ == '__main__':
OPTIONS['x'] = 1
print("Id is %d in main" % id(OPTIONS))
print("OPTIONS['x'] is %d" % OPTIONS['x'])
print("get_option('x') is %d" % get_option('x'))
输出:
Id is 140051744576688 in main
OPTIONS['x'] is 1
Id is 140051744604240 in get_option
get_option('x') is 0
注意:可以在系统上更改id的值。
现在,您可以看到两个地方的ID都不同,这意味着get_options()
函数中有两个 OPTIONS ,一个是__main__.OPTIONS
,另一个是{{ 1}}。但是,如果在foo.OPTIONS
中注释/删除行from foo import OPTIONS
,则会在这两个地方获得相同的ID。