91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python在局部變量域中執行代碼的方法是什么

發布時間:2020-08-10 16:14:59 來源:億速云 閱讀:155 作者:小新 欄目:開發技術

小編給大家分享一下Python在局部變量域中執行代碼的方法是什么,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

問題

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

解決方案

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

>>> 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 test
NameError: 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在局部變量域中執行代碼的方法是什么的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

遂川县| 中宁县| 大庆市| 乡城县| 互助| 石屏县| 当雄县| 古蔺县| 余干县| 孟津县| 兴和县| 井研县| 屯留县| 合山市| 南通市| 八宿县| 霍州市| 奉化市| 金乡县| 河北省| 鹰潭市| 宜州市| 潮州市| 广元市| 驻马店市| 雷波县| 宜昌市| 栾川县| 泗阳县| 双辽市| 马鞍山市| 长兴县| 玛曲县| 罗定市| 龙井市| 大埔区| 天台县| 玛多县| 太湖县| 泾阳县| 杭州市|