欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

問(wèn)題

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

解決方案

為了理解這個(gè)問(wèn)題,先試試一個(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 test
NameError: global name 'b' is not defined
>>>

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

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

>>> 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í)際局部變量值是沒(méi)有影響的。 下面是另外一個(gè)演示它的例子:

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

上面代碼里,當(dāng)你調(diào)用 locals() 獲取局部變量時(shí),你獲得的是傳遞給 exec() 的局部變量的一個(gè)拷貝。 通過(guò)在代碼執(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í)踐。 你只需要保證全局和局部字典在后面代碼訪問(wèn)時(shí)已經(jīng)被初始化。

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

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

相關(guān)文章

  • Python實(shí)現(xiàn)對(duì)桌面進(jìn)行實(shí)時(shí)捕捉畫(huà)面的方法詳解

    Python實(shí)現(xiàn)對(duì)桌面進(jìn)行實(shí)時(shí)捕捉畫(huà)面的方法詳解

    最近在研究目標(biāo)檢測(cè)方面的小東西,需要到對(duì)桌面進(jìn)行實(shí)時(shí)捕捉畫(huà)面。所以本文來(lái)用Python實(shí)現(xiàn)簡(jiǎn)單的對(duì)桌面進(jìn)行實(shí)時(shí)捕捉畫(huà)面,感興趣的可以了解一下
    2023-01-01
  • Python調(diào)用系統(tǒng)命令的四種方法詳解(os.system、os.popen、commands、subprocess)

    Python調(diào)用系統(tǒng)命令的四種方法詳解(os.system、os.popen、commands、subprocess)

    這篇文章主要介紹了Python調(diào)用系統(tǒng)命令的四種方法(os.system、os.popen、commands、subprocess),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • 基于pytorch的lstm參數(shù)使用詳解

    基于pytorch的lstm參數(shù)使用詳解

    今天小編就為大家分享一篇基于pytorch的lstm參數(shù)使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-01-01
  • PyTorch中tensor.backward()函數(shù)的詳細(xì)介紹及功能實(shí)現(xiàn)

    PyTorch中tensor.backward()函數(shù)的詳細(xì)介紹及功能實(shí)現(xiàn)

    backward()?函數(shù)是PyTorch框架中自動(dòng)求梯度功能的一部分,它負(fù)責(zé)執(zhí)行反向傳播算法以計(jì)算模型參數(shù)的梯度,這篇文章主要介紹了PyTorch中tensor.backward()函數(shù)的詳細(xì)介紹,需要的朋友可以參考下
    2024-02-02
  • 使用Python 統(tǒng)計(jì)高頻字?jǐn)?shù)的方法

    使用Python 統(tǒng)計(jì)高頻字?jǐn)?shù)的方法

    今天小編就為大家分享一篇使用Python 統(tǒng)計(jì)高頻字?jǐn)?shù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • python安裝與使用redis的方法

    python安裝與使用redis的方法

    這篇文章主要介紹了python安裝與使用redis的方法,分析了安裝與配置的具體步驟,并結(jié)合實(shí)例詳細(xì)分析了redis數(shù)據(jù)庫(kù)的具體使用技巧,需要的朋友可以參考下
    2016-04-04
  • Python找出列表中出現(xiàn)次數(shù)最多的元素三種方式

    Python找出列表中出現(xiàn)次數(shù)最多的元素三種方式

    本文通過(guò)三種方式給大家介紹Python找出列表中出現(xiàn)次數(shù)最多的元素,每種方式通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下
    2020-02-02
  • 使用Python實(shí)現(xiàn)不同需求的排行榜功能

    使用Python實(shí)現(xiàn)不同需求的排行榜功能

    這篇文章主要為大家介紹了Python實(shí)現(xiàn)不同需求的排行榜功能,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • python中Pytest常用的插件

    python中Pytest常用的插件

    這篇文章主要介紹了python中Pytest常用的插件,Pytest是Python的一種單元測(cè)試框架,與unittest相比,使用起來(lái)更簡(jiǎn)潔、效率更高,也是目前大部分使用python編寫(xiě)測(cè)試用例的小伙伴們的第一選擇了
    2022-06-06
  • Python+OpenCV實(shí)現(xiàn)信用卡數(shù)字識(shí)別的方法詳解

    Python+OpenCV實(shí)現(xiàn)信用卡數(shù)字識(shí)別的方法詳解

    這篇文章主要介紹了如何利用python?opencv實(shí)現(xiàn)信用卡數(shù)字識(shí)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-09-09

最新評(píng)論