2

eval()はどのようにdictを変更しますか?これは例です: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

の2番目の引数eval()は、によって実行される式に使用されるグローバルeval()です。

式を評価するときにpythonが行うことの1つは、評価された式でpythonビルトインが使用可能であることを確認し、それを行うために、そのグローバル名前空間にエントリを追加します。__builtins__

だから、はい、eval()呼び出しはあなたの辞書を変更しました、そしてそれは予想されたそして通常の振る舞いです。関数のドキュメントでもそう言っています:

グローバルディクショナリが存在し、'__builtins__'がない場合、が解析される前に、現在のグローバルがグローバルにコピーされます。これは、が通常、標準モジュールへのフルアクセスを持ち、制限された環境が伝播されることを意味します。__builtin__

この変更を回避したい場合dictは、グローバルに空を使用し、代わりに名前空間aとして使用します。locals

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

答えはドキュメントにあります!

まず、への2番目のパラメータevalglobal辞書です。より、私たちは見る:

グローバルディクショナリが存在し、'__builtins__'がない場合、式が解析される前に、現在のグローバルがグローバルにコピーされます。

そうです、あなたの辞書はへの呼び出しによって変更されますeval

于 2012-11-21T10:53:55.137 に答える
0

はい、そうです。の2番目の引数eval()は、表示されている内容を説明する「グローバル」辞書です。

于 2012-11-21T10:50:05.753 に答える