簡體   English   中英

為什么'exec'在 function 內部表現不同?

[英]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 中時拋出錯誤?

這在execlocals的互動中進行了討論。 global上下文中(不在函數中)沒有問題 - exec修改全局變量,您會看到結果。 在 function 中,執行上下文是本地 function,但exec無法更改本地上下文 通常的解決方法是傳遞一個本地上下文,您可以在其中看到更改:

local_context = {}
exec('ex = eval(expressions[op])+"0"', locals(), local_context)
ex = local_context['ex']

這里,第二個參數locals()實際上是作為“全局變量”傳遞給 exec 的。 這就是expressionsop之類的東西可用。 除非您實際使用全局變量或其他一些 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM