亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁/技術文章
文章詳情頁

Python 在局部變量域中執行代碼

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

問題

你想在使用范圍內執行某個代碼片段,并且希望在執行后所有的結果都不可見。

解決方案

為了理解這個問題,先試試一個簡單場景。首先,在全局命名空間內執行一個代碼片段:

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

然后,再在一個函數中執行同樣的代碼:

>>> 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>>>

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

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

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

討論

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

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

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

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

>>> 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>>>

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

在使用 locals() 的時候,你需要注意操作順序。每次它被調用的時候, locals() 會獲取局部變量值中的值并覆蓋字典中相應的變量。 請注意觀察下下面這個試驗的輸出結果:

>>> 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}>>>

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

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

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

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

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

以上就是Python 在局部變量域中執行代碼的詳細內容,更多關于Python 局部變量域的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 国产成人亚洲精品老王 | 亚洲 自拍 欧美 另类小说 | 国产精品免费视频一区二区 | 欧美一级久久久久久久大片 | 精品在线一区二区三区 | 亚洲精品国产福利 | 99re在线这里只有精品 | 久久综合九色综合欧洲色 | 色综合久久久久久久久五月性色 | 黄色成人毛片 | 日韩欧美小视频 | 真人一级毛片免费完整视 | 国产欧美日韩一区二区三区在线 | 国产亚洲综合色就色 | 欧美一级在线观看视频 | 欧美黑人两根巨大挤入 | 日韩国产欧美在线观看一区二区 | 国产情侣自拍偷拍 | 亚洲欧美久久精品 | 欧美日韩中文国产一区 | 久久se精品一区二区影院 | 1769视频在线 | 国产成人吃奶一区 | 国产免费a级片 | 国产成人一区二区三区影院免费 | 国产一级黄色毛片 | 久久www免费人成看片入口 | 国产成人污污网站在线观看 | 亚洲一欧洲中文字幕在线 | 国产精品久久久久久久久鸭 | 182福利视频在线观看黄 | 日韩中文字幕在线亚洲一区 | 国产在线拍国产拍拍偷 | 亚洲精品黄| 中国一级黄色毛片 | 911短视频| 色综合久久中文综合网 | 女人被男人狂躁视频免费 | 银杏视频影院在线看 | 桃花阁成人网在线观看 | 91啦中文成人 |