2

eval() 如何改变字典?这是一个例子:创建一个 dict -> print -> eval -> print

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

3 回答 3

4

to 的第二个参数eval()是用于表达式 run by 的全局变量eval()

python 在评估表达式时所做的一件事是确保 python 内置函数可用于评估的表达式,并为此__builtins__条目添加到该全局命名空间。

所以,是的,这个eval()电话确实改变了你的字典,这是预期的正常行为。它甚至在函数的文档中这样说:

如果全局字典存在并且缺少'__builtins__',则在解析表达式之前将当前全局变量复制到全局变量中。这意味着表达式通常可以完全访问标准模块并且传播受限环境。__builtin__

如果要避免dict此更改,请为全局变量使用空值,并改为a用作locals命名空间:

eval('a == "a"', {}, a)
于 2012-11-21T10:52:54.860 回答
2

答案在文档中!

首先,to的第二个参数evalglobal字典。比,我们看到:

如果全局字典存在并且缺少'__builtins__',则在解析表达式之前将当前全局变量复制到全局变量中。

所以是的,你的字典被调用修改了eval

于 2012-11-21T10:53:55.137 回答
0

是的,它确实。第二个参数eval()是“全局”字典,它解释了你所看到的。

于 2012-11-21T10:50:05.753 回答