av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術(shù)文章
文章詳情頁

Python 在局部變量域中執(zhí)行代碼

瀏覽:7日期:2022-07-14 16:04:09

問題

你想在使用范圍內(nèi)執(zhí)行某個(gè)代碼片段,并且希望在執(zhí)行后所有的結(jié)果都不可見。

解決方案

為了理解這個(gè)問題,先試試一個(gè)簡(jiǎn)單場(chǎng)景。首先,在全局命名空間內(nèi)執(zhí)行一個(gè)代碼片段:

>>> a = 13>>> exec(’b = a + 1’)>>> print(b)14>>>

然后,再在一個(gè)函數(shù)中執(zhí)行同樣的代碼:

>>> def test():... a = 13... exec(’b = a + 1’)... print(b)...>>> test()Traceback (most recent call last): File '<stdin>', line 1, in <module> File '<stdin>', line 4, in testNameError: global name ’b’ is not defined>>>

可以看出,最后拋出了一個(gè)NameError異常,就跟在 exec() 語句從沒執(zhí)行過一樣。 要是你想在后面的計(jì)算中使用到 exec() 執(zhí)行結(jié)果的話就會(huì)有問題了。

為了修正這樣的錯(cuò)誤,你需要在調(diào)用 exec() 之前使用 locals() 函數(shù)來得到一個(gè)局部變量字典。 之后你就能從局部字典中獲取修改過后的變量值了。例如:

>>> def test():... a = 13... loc = locals()... exec(’b = a + 1’)... b = loc[’b’]... print(b)...>>> test()14>>>

討論

實(shí)際上對(duì)于 exec() 的正確使用是比較難的。大多數(shù)情況下當(dāng)你要考慮使用 exec() 的時(shí)候, 還有另外更好的解決方案(比如裝飾器、閉包、元類等等)。

然而,如果你仍然要使用 exec() ,本節(jié)列出了一些如何正確使用它的方法。 默認(rèn)情況下,exec() 會(huì)在調(diào)用者局部和全局范圍內(nèi)執(zhí)行代碼。然而,在函數(shù)里面, 傳遞給 exec() 的局部范圍是拷貝實(shí)際局部變量組成的一個(gè)字典。 因此,如果 exec() 如果執(zhí)行了修改操作,這種修改后的結(jié)果對(duì)實(shí)際局部變量值是沒有影響的。 下面是另外一個(gè)演示它的例子:

>>> def test1():... x = 0... exec(’x += 1’)... print(x)...>>> test1()0>>>

上面代碼里,當(dāng)你調(diào)用 locals() 獲取局部變量時(shí),你獲得的是傳遞給 exec() 的局部變量的一個(gè)拷貝。 通過在代碼執(zhí)行后審查這個(gè)字典的值,那就能獲取修改后的值了。下面是一個(gè)演示例子:

>>> def test2():... x = 0... loc = locals()... print(’before:’, loc)... exec(’x += 1’)... print(’after:’, loc)... print(’x =’, x)...>>> test2()before: {’x’: 0}after: {’loc’: {...}, ’x’: 1}x = 0>>>

仔細(xì)觀察最后一步的輸出,除非你將 loc 中被修改后的值手動(dòng)賦值給x,否則x變量值是不會(huì)變的。

在使用 locals() 的時(shí)候,你需要注意操作順序。每次它被調(diào)用的時(shí)候, locals() 會(huì)獲取局部變量值中的值并覆蓋字典中相應(yīng)的變量。 請(qǐng)注意觀察下下面這個(gè)試驗(yàn)的輸出結(jié)果:

>>> def test3():... x = 0... loc = locals()... print(loc)... exec(’x += 1’)... print(loc)... locals()... print(loc)...>>> test3(){’x’: 0}{’loc’: {...}, ’x’: 1}{’loc’: {...}, ’x’: 0}>>>

>>> def test3():... x = 0... loc = locals()... print(loc)... exec(’x += 1’)... print(loc)... locals()... print(loc)...>>> test3(){’x’: 0}{’loc’: {...}, ’x’: 1}{’loc’: {...}, ’x’: 0}>>>

注意最后一次調(diào)用 locals() 的時(shí)候x的值是如何被覆蓋掉的。

作為 locals() 的一個(gè)替代方案,你可以使用你自己的字典,并將它傳遞給 exec() 。例如:

>>> def test4():... a = 13... loc = { ’a’ : a }... glb = { }... exec(’b = a + 1’, glb, loc)... b = loc[’b’]... print(b)...>>> test4()14>>>

大部分情況下,這種方式是使用 exec() 的最佳實(shí)踐。 你只需要保證全局和局部字典在后面代碼訪問時(shí)已經(jīng)被初始化。

還有一點(diǎn),在使用 exec() 之前,你可能需要問下自己是否有其他更好的替代方案。 大多數(shù)情況下當(dāng)你要考慮使用 exec() 的時(shí)候, 還有另外更好的解決方案,比如裝飾器、閉包、元類,或其他一些元編程特性。

以上就是Python 在局部變量域中執(zhí)行代碼的詳細(xì)內(nèi)容,更多關(guān)于Python 局部變量域的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 免费看av大片 | 精品久久久久久久久久久久久久 | 超碰伊人| 久久久久久久久久影视 | 成人免费视频 | 91精品国产一区二区三区 | 亚洲精品久久国产高清情趣图文 | 日日操夜夜操天天操 | 久久久成人免费一区二区 | 99re热这里只有精品视频 | 日日夜夜天天 | 日日操操| 天天操妹子 | 日本一区二区三区四区 | 久久久噜噜噜久久中文字幕色伊伊 | 爱爱免费视频网站 | 天天干夜夜操 | 国产成人精品一区二区三区四区 | 老司机狠狠爱 | 亚洲福利 | 精品国产91亚洲一区二区三区www | 久久久久9999亚洲精品 | 日韩三级免费观看 | 九九综合 | 精品日韩一区二区三区av动图 | 久久新| eeuss国产一区二区三区四区 | 99riav国产一区二区三区 | 日本a∨视频 | 黄色大片在线免费观看 | 国产精品2 | 精品不卡 | 色综合久久久 | 瑟瑟视频在线看 | 午夜不卡一区二区 | 日本久久一区二区三区 | 日韩精品一区二区三区中文字幕 | 一区二区三区四区在线播放 | 精品不卡 | 欧美人人 | 欧美精品一区在线 |