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)
的第二个参数eval()是用于运行的表达式的全局变量eval()。
python 在计算表达式时所做的一件事是确保 python 内置函数可用于计算的表达式,并且为此它将条目添加__builtins__到该全局命名空间。
所以,是的,这个eval()电话确实改变了你的字典,这是预期的、正常的行为。它甚至在该函数的文档中这样说:
\n\n\n如果全局字典存在并且缺少 \xe2\x80\x98__builtins__\xe2\x80\x99,则在解析表达式之前将当前全局变量复制到全局变量中。这意味着表达式通常可以完全访问标准模块并传播受限环境。
\n__builtin__
如果您想避免此更改,请使用空的dict全局变量,并使用命名a空间locals:
eval(\'a == "a"\', {}, a)\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
4600 次 |
| 最近记录: |