Python 內建函式:——locals 和 globals介紹
locals 和 globals這兩個函式主要提供,基於字典的訪問區域性和全域性變數的方式。 |
在理解這兩個函式時,首先來理解一下 Python 中的名字空間概念。Python 使用叫做名字空間的東西來記錄變數的軌跡。名字空間只是一個字典,它的鍵字就是變數名,字典的值就是那些變數的值。
實際上,名字空間可以像 Python 的字典一樣進行訪問。
每個函式都有著自已的名字空間,叫做區域性名字空間,它記錄了函式的變數,包括函式的引數和區域性定義的變數。每個模組擁有它自已的名字空間,叫做全域性名字空間,它記錄了模組的變數,包括函式、類、其它匯入的模組、模組級的變數和常量。還有就是內建名字空間,任何模組均可訪問它,它存放著內建的函式和異常。
當一行程式碼要使用變數 x 的值時,Python 會到所有可用的名字空間去查詢變數,按照如下順序:
- 區域性名字空間 - 特指當前函式或類的方法。如果函式定義了一個區域性變數 x,Python將使用這個變數,然後停止搜尋。
- 全域性名字空間 - 特指當前的模組。如果模組定義了一個名為 x 的變數,函式或類,Python將使用這個變數然後停止搜尋。
- 內建名字空間 - 對每個模組都是全域性的。作為最後的嘗試,Python 將假設 x 是內建函式或變數。
如果 Python 在這些名字空間找不到 x,它將放棄查詢並引發一個 NameError 的異常,同時傳遞 There is no variable named 'x' 這樣一條資訊。
區域性變數函式 locals 例子(locals 返回一個名字/值對的字典):
例項
def foo(arg, a): x = 1 y = 'xxxxxx' for i in range(10): j = 1 k = i print(locals()) #呼叫函式的列印結果 foo(1,2) #{'k': 9, 'j': 1, 'i': 9, 'y': 'xxxxxx', 'x': 1, 'a': 2, 'arg': 1}
from module import 和 import module 之間的不同。使用 import module,模組自身被匯入,但是它保持著自已的名字空間,這就是為什麼你需要使用模組名來訪問它的函式或屬性(module.function)的原因。但是使用 from module import,實際上是從另一個模組中將指定的函式和屬性匯入到你自己的名字空間,這就是為什麼你可以直接訪問它們卻不需要引用它們所來源的模組的原因。
locals 是隻讀的,globals 不是。
locals 不可修改,globals 可以修改,原因是:
- locals() 實際上沒有返回區域性名字空間,它返回的是一個複製。所以對它進行修改,修改的是複製,而對實際的區域性名字空間中的變數值並無影響。
- globals() 返回的是實際的全域性名字空間,而不是一個複製與 locals 的行為完全相反。
所以對 globals 所返回的 dictionary 的任何的改動都會直接影響到全域性變數的取值。
例項
#!/usr/bin/env python z = 7 #定義全域性變數 def foo(arg): x = 1 print( locals() ) print('x=',x) locals()['x'] = 2 #修改的是區域性名字空間的複製,而實際的區域性名字空間中的變數值並無影響。 print( locals() ) print( "x=",x ) foo(3) print( globals() ) print( 'z=',z ) globals()["z"] = 8 #globals()返回的是實際的全域性名字空間,修改變數z的值 print( globals() ) print( "z=",z )
輸出結果為:
{'x': 1, 'arg': 3} x= 1 {'x': 1, 'arg': 3} x= 1 {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10b099358>, '__spec__': None, '__annotations__': {}, '__builtins__':, '__file__': 'test.py', '__cached__': None, 'z': 7, 'foo':} z= 7 {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10b099358>, '__spec__': None, '__annotations__': {}, '__builtins__':, '__file__': 'test.py', '__cached__': None, 'z': 8, 'foo':} z= 8
原文地址:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2687927/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python 兩個內建函式: locals() 和 globals()Python函式
- 【Python】python內建函式介紹Python函式
- Python的常用內建函式介紹Python函式
- python內建函式的簡單使用和介紹Python函式
- 【python】locals()、globals()與名字空間Python
- SQL Server 內建轉換函式介紹SQLServer函式
- Python函式——locals()解包傳參Python函式
- JMeter36個內建函式及11個新增函式介紹JMeter函式
- Dart建構函式介紹Dart函式
- Python內建函式Python函式
- python 內建函式Python函式
- Linux Awk 內建函式詳細介紹(例項)Linux函式
- Python內建函式示例Python函式
- python常用內建函式Python函式
- 1.5.5 Python內建函式Python函式
- Python內建函式(一)Python函式
- Python內建函式(二)Python函式
- Python 內建函式大全Python函式
- python內建函式大全Python函式
- python 常用內建函式Python函式
- python內建函式——sortedPython函式
- jQuery建構函式簡單介紹jQuery函式
- python合集———內建函式合集Python函式
- python內建函式 map/reducePython函式
- python 66個內建函式Python函式
- python的部分內建函式Python函式
- python3內建函式Python函式
- python常見內建函式Python函式
- 【Python】內建函式 enumeratePython函式
- python 內建函式setattr() getattr()Python函式
- python高階內建函式Python函式
- 函式表示式和函式宣告簡單介紹函式
- js Date()建構函式簡單介紹JS函式
- python 獲取函式的所有引數列表:locals()Python函式
- python 的數值和字串和相關內建函式Python字串函式
- 內建函式函式
- 12.4、python內建函式—sortedPython函式
- 12.2、python內建函式—formatPython函式ORM