eval()函数如何改变dict?

时间:2012-11-21 10:48:14

标签: python dictionary python-3.x eval

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.
...

3 个答案:

答案 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()的第二个参数是“全局”字典,它解释了你所看到的内容。