最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2020年08月07日 16:40:20   作者:David Beazley  
這篇文章主要介紹了Python 如何在局部變量域中執(zhí)行代碼,幫助大家更好的理解和學(xué)習(xí)Python,感興趣的朋友可以了解下

問題

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

解決方案

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

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

然后,再在一個函數(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 test
NameError: global name 'b' is not defined
>>>

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

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

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

討論

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

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

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

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

>>> 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 中被修改后的值手動賦值給x,否則x變量值是不會變的。

在使用 locals() 的時候,你需要注意操作順序。每次它被調(diào)用的時候, locals() 會獲取局部變量值中的值并覆蓋字典中相應(yīng)的變量。 請注意觀察下下面這個試驗(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() 的時候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() 的最佳實(shí)踐。 你只需要保證全局和局部字典在后面代碼訪問時已經(jīng)被初始化。

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

以上就是Python 在局部變量域中執(zhí)行代碼的詳細(xì)內(nèi)容,更多關(guān)于Python 局部變量域的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 導(dǎo)入tensorflow:ImportError: libcublas.so.9.0 報錯

    導(dǎo)入tensorflow:ImportError: libcublas.so.9.0 報錯

    這篇文章主要介紹了導(dǎo)入tensorflow:ImportError: libcublas.so.9.0 報錯,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Python使用Matplotlib庫創(chuàng)建3D 圖形和交互式圖形詳解

    Python使用Matplotlib庫創(chuàng)建3D 圖形和交互式圖形詳解

    Matplotlib 是 Python 中最重要的數(shù)據(jù)可視化庫之一,在本文中,我們將深入研究 Matplotlib 的高級特性,特別是如何創(chuàng)建 3D 圖形和交互式圖形,需要的朋友可以參考下
    2023-07-07
  • python分割和拼接字符串

    python分割和拼接字符串

    python分割和拼接字符串的實(shí)例,使用了string的split和join 方法,并對這二個方法做說明。
    2013-11-11
  • pandas如何實(shí)現(xiàn)兩個dataframe相減

    pandas如何實(shí)現(xiàn)兩個dataframe相減

    這篇文章主要介紹了pandas如何實(shí)現(xiàn)兩個dataframe相減方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • 一起來了解python的if流程控制

    一起來了解python的if流程控制

    這篇文章主要為大家詳細(xì)介紹了python的if流程控制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • python?面向?qū)ο箝_發(fā)及基本特征

    python?面向?qū)ο箝_發(fā)及基本特征

    面向?qū)ο缶幊淌且环N編程方式,此編程方式的落地需要使用“類”和 “對象”來實(shí)現(xiàn),所以,面向?qū)ο缶幊唐鋵?shí)就是對 “類”和“對象” 的使用,今天給大家介紹下python?面向?qū)ο箝_發(fā)及基本特征,感興趣的朋友一起看看吧
    2022-03-03
  • 如何一鍵理清大型Python項(xiàng)目依賴樹

    如何一鍵理清大型Python項(xiàng)目依賴樹

    這篇文章主要介紹了如何一鍵理清大型Python項(xiàng)目依賴樹,文章圍繞主題相關(guān)資料展開詳細(xì)的內(nèi)容介紹,感興趣的小伙伴可以參考一下
    2022-06-06
  • 解決CentOS下ImportError: No module named '_sqlite3'的問題

    解決CentOS下ImportError: No module named &a

    這篇文章主要介紹了解決CentOS下ImportError: No module named '_sqlite3'的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Python批量生成幻影坦克圖片實(shí)例代碼

    Python批量生成幻影坦克圖片實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于如何利用Python批量生成幻影坦克圖片的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • python提取log文件內(nèi)容并畫出圖表

    python提取log文件內(nèi)容并畫出圖表

    這篇文章主要介紹了python提取log文件內(nèi)容并畫出圖表,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07

最新評論

赤峰市| 麻栗坡县| 昌江| 郁南县| 沂源县| 江安县| 东城区| 宣恩县| 湄潭县| 务川| 重庆市| 化州市| 沅江市| 自贡市| 右玉县| 星座| 普定县| 来凤县| 延长县| 巴中市| 云霄县| 通化县| 乐业县| 友谊县| 柞水县| 阿合奇县| 孝义市| 巴青县| 句容市| 蒙自县| 宣城市| 勃利县| 昭平县| 襄汾县| 呼玛县| 比如县| 怀来县| 赣榆县| 浮梁县| 涞水县| 晋中市|