[英]why 'exec' is behaving different inside the function?
我的問題
我的解決方案:
import re
import math
a = input().replace("|","")
op = re.findall("[A-Z]+", a)[0]
a = list(map(float,re.split(r'P|S|M|D',a)))
expressions = {'P':'str(a[0]+a[1])','S':'str(a[0]-a[1])','M':'str(a[0]*a[1])','D':'str(a[0]/a[1])'}
exec('ex = eval(expressions[op])+"0"')
ex = ex[:ex.find(".")+3][::-1]
l = [6]
l.extend([6+3*x for x in range(1,(len(ex)-6)//2+1)])
if ex[-1]=="-":
l.pop()
for i in l:
ex = ex[:i] + "|" + ex[i:]
ex = ex[::-1]
ex = "0"+ex.strip("|") if ex.find("|")==1 else ex.strip("|")
print(ex)
問題:
如果我將此代碼包裝在 function 中,該 function 接受字符串輸入並嘗試返回我的ex
,代碼顯示錯誤並且沒有任何改變。我的問題是,誰能解釋為什么它單獨工作完美並在包裝在 function 中時拋出錯誤?
這在exec
與locals
的互動中進行了討論。 在global
上下文中(不在函數中)沒有問題 - exec
修改全局變量,您會看到結果。 在 function 中,執行上下文是本地 function,但exec
無法更改本地上下文。 通常的解決方法是傳遞一個本地上下文,您可以在其中看到更改:
local_context = {}
exec('ex = eval(expressions[op])+"0"', locals(), local_context)
ex = local_context['ex']
這里,第二個參數locals()
實際上是作為“全局變量”傳遞給 exec 的。 這就是expressions
和op
之類的東西可用。 除非您實際使用全局變量或其他一些 function,否則在此處傳遞globals()
通常沒有用。
第三個參數是exec
可以使用的 locals,以及將填充的內容。 如果你傳遞globals()
作為第二個參數,那么通常你也想傳遞你打算在這里使用的局部變量。 在此處傳遞locals()
不會修改您的實際本地人,因此通常會更令人困惑。
注意使用
exec('global ex; ex = eval(expressions[op])+"0"')
global ex # Need this to make sure the function knows about the new global variable in its local context
將工作並創建一個具有正確內容的全局ex
變量。 這就是為什么exec
像您期望的那樣使用 function 工作的原因,在全局上下文中修改當前上下文沒有問題。 請注意 function 本身需要被告知將全局ex
添加到其本地上下文中,因此需要兩個全局變量。
請注意,如果沒有給出默認值,則局部變量為locals()
,全局變量為globals()
,如果僅給出全局變量,則局部變量也將等於該值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.