eval()如何改变字典?这是一个例子:创建一个字典 - >打印 - > eval - >打印
>>> a={'a':'a','b':'b'}
>>> print(a)
{'a': 'a', 'b': 'b'}
>>> eval('a == "a"',a)
True
>>> print(a)
{'a': 'a', '__builtins__': {'bytearray': <class 'bytearray'>, 'IndexError': <class 'IndexError'>, 'all': <built-in function all>, 'help': Type help() for interactive help, or help(object) for help about object., 'vars': <built-in function vars>, 'SyntaxError': <class 'SyntaxError'>, 'UnicodeDecodeError': <class 'UnicodeDecodeError'>, 'memoryview': <class 'memoryview'>, 'isinstance': <built-in function isinstance>, '__build_class__': <built-in function __build_class__>, 'copyright': Copyright (c) 2001-2012 Python Software Foundation.
All Rights Reserved.
...
答案 0 :(得分:3)
eval()
的第二个参数是用于eval()
运行的表达式的全局变量。
python在评估表达式时所做的一件事是确保python内置函数可用于已计算的表达式,为此,它将<{em}}条目添加到该全局变量中命名空间。
所以,是的,__builtins__
调用确实改变了你的字典,这是预期和正常的行为。它甚至在函数的文档中也这样说:
如果 globals 字典存在且缺少'__builtins__',则在解析表达式之前,会将当前全局变量复制到 globals 中。这意味着表达式通常具有对标准
__builtin__
模块的完全访问权限,并且传播受限制的环境。
如果您想避免此更改,请对全局变量使用空eval()
,而使用dict
作为a
命名空间:
locals
答案 1 :(得分:1)
答案在于the doc!
首先,eval
的第二个参数是global
字典。比,我们看到:
如果全局字典存在且缺少'__builtins__',那么 在解析表达式之前,将当前全局变量复制到全局变量中。
所以,是的,通过调用eval
来修改您的词典。
答案 2 :(得分:0)
是的。 eval()
的第二个参数是“全局”字典,它解释了你所看到的内容。