次のコードでは、Python2
と で異なる出力が得られPython3
ます。
from sys import version
print(version)
def execute(a, st):
b = 42
exec("b = {}\nprint('b:', b)".format(st))
print(b)
a = 1.
execute(a, "1.E6*a")
Python2
プリント:
2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)]
('b:', 1000000.0)
1000000.0
Python3
プリント:
3.2.3 (default, Apr 11 2012, 07:15:24) [MSC v.1500 32 bit (Intel)]
b: 1000000.0
42
関数内の変数を関数の文字列の値にPython2
バインドするのに、これを行わないのはなぜですか? inの動作を実現するにはどうすればよいですか? で機能するグローバルとローカルの辞書を渡そうとしましたが、これまでのところ何も機能しませんでした。b
execute
exec
Python3
Python2
Python3
exec
Python3
- - 編集 - -
Martijns の回答を読んだ後、これをさらに分析しましたPython3
。次の例では、locals()
辞書をd
に与えますexec
がd['b']
、単に印刷する以外の何かを印刷しb
ます。
from sys import version
print(version)
def execute(a, st):
b = 42
d = locals()
exec("b = {}\nprint('b:', b)".format(st), globals(), d)
print(b) # This prints 42
print(d['b']) # This prints 1000000.0
print(id(d) == id(locals())) # This prints True
a = 1.
execute(a, "1.E6*a")
3.2.3 (default, Apr 11 2012, 07:15:24) [MSC v.1500 32 bit (Intel)]
b: 1000000.0
42
1000000.0
True
d
と の IDを比較すると、locals()
それらが同じオブジェクトであることがわかります。しかし、これらの条件下b
では と同じである必要がありますd['b']
。私の例では何が間違っていますか?