eval() 函数如何改变字典?

xie*_*yun 2 python dictionary eval python-3.x

eval() 如何改变字典?这是一个例子:创建一个字典 -> 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.
...
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 6

的第二个参数eval()是用于运行的表达式的全局变量eval()

\n\n

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

\n\n

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

\n\n
\n

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

\n
\n\n

如果您想避免此更改,请使用空的dict全局变量,并使用命名a空间locals

\n\n
eval(\'a == "a"\', {}, a)\n
Run Code Online (Sandbox Code Playgroud)\n