亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

是否可以從函數內訪問 exec 提供的全局字典?

是否可以從函數內訪問 exec 提供的全局字典?

qq_遁去的一_1 2021-08-05 16:10:34
如果函數是在 exec 代碼之外定義的(因此已經綁定到不同的__globals__),是否可以從函數內部訪問 exec 提供的全局字典?換句話說,有沒有辦法讓下面的例子工作?def f():    log("Hi")exec('f()', {'f': f, 'log': print})一般來說,是否可以替換__globals__函數的 ?
查看完整描述

2 回答

?
德瑪西亞99

TA貢獻1770條經驗 獲得超3個贊

不確定我的解釋是否完全正確。簡而言之,該示例無法在 Python 3 中運行。


原因是 2 種情況的組合:[1] -exec是 Python 3 中的函數,[2] - 您嘗試執行的代碼包含函數調用。


當您為globals函數提供可選參數時,exec它是該函數的局部作用域。所以下面的例子有效:


exec('log("Hi")', {'log': print})

但是原版沒有。因為在原始示例中,您調用了函數f. 它有自己的本地范圍。Python 是做什么的?它檢查全局作用域(程序的實際全局作用域)和最內層作用域(函數的局部作用域f)。兩個范圍都缺少log,你得到NameError.


您可以使用兩個常規函數獲得完全相同的行為(相同的錯誤):


def f():

    log("Hi")



def f_():

    log = print

    f()


f_()


查看完整回答
反對 回復 2021-08-05
  • 2 回答
  • 0 關注
  • 141 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號