這個問題與其他人在這裏提出的問題類似,但在閱讀答案後,我並不理解它,並希望得到進一步的指導。Python中嵌套函數的作用域
在繪製新的代碼,我發現自己加入了很多語句,如:
print('var=')
pprint(var)
它變得乏味總是寫這一點,所以我想我可以使它成爲一個功能。因爲我想打印前行中的變量名,我想:
def dbp(var):
eval('print(\'{0}=\')'.format(var))
eval('pprint({0})'.format(var))
所以後來我做不喜歡的東西:
foo = 'bar'
dbp('foo')
它打印
foo=
'bar'
這是所有很好,但是當我在功能中使用它時,事情會變得混亂。例如,做
def f():
a = ['123']
dbp('a')
f()
引發NameError(NameError:name'a'未定義)。
我的期望是dbp()可以讀取f()範圍內的任何內容,但顯然它沒有。有人能解釋爲什麼嗎?
此外,更好的方式打印一個變量的名稱,其後格式化的內容也值得讚賞。
'foo'是本地模塊'DBP( )'在模塊範圍內,因此可以訪問模塊範圍。 'a'對'f()'是局部的''dbp()'不能訪問'f()的作用域。如果你在'f()'內部使用'def dbp()',那麼它就可以訪問f()的作用域。解決這個問題的辦法是通過'locals()',然後你可以使用locals()['a']',你不需要'eval()'語句。 – AChampion
在這兩種情況下,您都會傳遞一個字符串,eval會嘗試打印該變量。如果該變量在eval的範圍內,則會打印該變量。否則,它不是。 –
爲什麼你'eval()'第一個'print()'?不會'print('{0} ='。format(var))'做? – AChampion