Python:更改导入的dict中的值无效

时间:2016-08-01 15:03:29

标签: python python-2.7 python-3.4

这是一个有趣的。使用以下内容创建文件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

1 个答案:

答案 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。