簡體   English   中英

通過更改和導入模塊在Python中傳遞“局部”變量?

[英]Passing “local” variables in Python by changing and importing modules?

今天,我不得不閱讀和修復一些非常糟糕的腳本,而我感到困惑,因為我根本不理解它們為什么起作用。 明確地說,我永遠不會做這樣的事情。 我的問題是在這種情況下名稱空間的工作原理 ,而不是為什么它是一個壞主意或如何做得更好。

無論如何,可以用兩個文件來復制最簡單形式的情況。

test.py

import math
math.myvar = "Is this a local variable?"
math.pi = 1.2345
import u

u.py

import math
print(math.myvar)
print(math.pi)

現在,令我驚訝的是,運行python test.py將輸出myvar和pi的錯誤值。 當然,如果沒有在u.py import math ,它將不會輸出myvar 這是怎么發生的? 盡管導入的模塊在作用域上完全是本地的。

模塊是全局單例。 它們存儲在sys.modules映射中,以防止每次在某個地方使用每個模塊時都必須加載它。

模塊中的所有全局變量都作為屬性公開在模塊對象上。 math.pi就是這樣的一個整體。 您可以通過分配它們來更改這些全局變量,並且由於模塊是單例對象,因此對模塊對象的每個引用都將看到更改。

記住,Python名稱是引用 名稱math實際上確實是模塊的“本地”名稱,但是它仍然是對<module 'math' from '/usr/lib/python2.7/lib-dynload/math.so'>對象中的全局<module 'math' from '/usr/lib/python2.7/lib-dynload/math.so'>的引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM