Python:在导入的dict中更改值有n

2024-03-29 07:01:56 发布

您现在位置:Python中文网/ 问答频道 /正文

这里有一个有趣的。创建具有以下内容的文件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?你知道吗


Tags: 文件keyfrompyimportgetreturnif
1条回答
网友
1楼 · 发布于 2024-03-29 07:01:56

之所以会出现这种情况,是因为get_options()函数中的from foo import OPTIONS行在值为{x':0}的内存中加载了一个新的局部选项变量。但如果删除/注释该行,则得到预期结果,这是因为get_options()中的asOPTIONS变量现在是一个全局变量,而不是一个局部。你知道吗

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。你知道吗

相关问题 更多 >