2016-08-01 65 views
1

这里有趣。使用以下内容创建一个文件foo.pyPython:在导入的字典中更改值无效

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

你有两个'选项','__main __。OPTIONS'和'foo.OPTIONS'。 – user2357112

+0

__main__中的选项位于locals()中,但get_option中的OPTIOINS全局变量() –

回答

2

您收到此,因为from foo import OPTIONS线get_options()功能,其值是内存加载一个新本地选项变量{“X”:0}。但是,如果您删除/注释该行,那么您得到了预期的结果,这是因为选项变量get_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()功能之一是__main__.OPTIONS而另一种是foo.OPTIONS。但是,如果在get_options()中评论/删除线from foo import OPTIONS,则在两处都会得到相同的ID。

+0

字典不应该通过引用吗?当我将'get_option'改为'import foo;返回foo.OPTIONS [key]'。 –

+0

@MichaelHerrmann我按照您的建议进行了更改后没有得到相同的结果。你可以分享你的变化,清楚地了解它。 –

+0

我还是把它们放在2.7.6 –