这里有一个有趣的。创建具有以下内容的文件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
?你知道吗
之所以会出现这种情况,是因为
get_options()
函数中的from foo import OPTIONS
行在值为{x':0}的内存中加载了一个新的局部选项变量。但如果删除/注释该行,则得到预期结果,这是因为get_options()
中的asOPTIONS变量现在是一个全局变量,而不是一个局部。你知道吗您还可以通过使用id()函数进行调试,该函数在对象的生存期内返回对象的“标识”。你知道吗
为此,调试代码为:
输出:
注意:id的值可以在系统上更改。
现在,您可以看到id在这两个地方是不同的,这意味着在
get_options()
函数中有两个选项,一个是__main__.OPTIONS
,另一个是foo.OPTIONS
。但是,如果注释/删除get_options()
中的from foo import OPTIONS
行,则在这两个位置得到相同的id。你知道吗相关问题 更多 >
编程相关推荐