a='''b="ddd"'''
eval(repr(a))
print str(a)
print b
請儘量使用代碼,而不是文字,因爲我的英語不是很好,謝謝爲什麼我的「EVAL」功能不工作,我認爲它可以打印「B」,而不是
a='''b="ddd"'''
eval(repr(a))
print str(a)
print b
請儘量使用代碼,而不是文字,因爲我的英語不是很好,謝謝爲什麼我的「EVAL」功能不工作,我認爲它可以打印「B」,而不是
用途:
eval(compile(a,'<string>','exec'))
代替:
eval(repr(a))
成績單:
>>> a='''b="ddd"'''
>>> eval(compile(a,'<string>','exec'))
>>> print str(a)
b="ddd"
>>> print b
ddd
問題是,您實際上正在執行語句'b="ddd"'
,該語句不是b
的賦值,而是字符串的評估。
eval()
內置的,當給定一個字符串時,將其評估爲表達式(不是語句)並返回結果。您可以通過爲其提供一個代碼對象來運行非表達式代碼eval()
,我們使用上面的compile()
創建代碼對象。在這種情況下,它將運行代碼並返回None
。
你可以看到一個類似的效果,如果你只需要輸入:
>>> 'c=7'
'c=7'
>>> c
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'c' is not defined
>>> c=7
>>> c
7
>>> '7=d'
'7=d'
>>> 7=d
File "<stdin>", line 1
SyntaxError: can't assign to literal
顯然7=d
不是有效的Python,但'7=d'
是,由於以上原因解釋。
的expr()
,repr()
和compile()
內置插件的描述,足以足以工作了這一點,發現here。在做出這個答案的過程中,沒有任何內建損害。
重新考慮您是否確實需要使用eval()
。例如,你可以使用globals()
這樣的:
>>> globals()['b'] = 'ddd'
>>> print b
ddd
但是,也許你應該使用什麼只是一個dictionary:
>>> my_namespace = dict()
>>> my_namespace['b'] = 'ddd'
>>> my_namespace
{'b': 'ddd'}
>>> print my_namespace['b']
ddd
參見:http://docs.python.org /reference/simple_stmts.html#exec – Miles 2009-12-24 07:40:52