python的globals()使用


  使用命令pyrasite-shell pid,可以與進程進行shell交互,獲取,在shell里執行globals(),可以獲取整個進程的全部全局變量,比如django應用、flask應用的變量,而不是獲取某個模塊的全部全局變量,更新信息:https://www.cnblogs.com/shengulong/p/8044132.html

  

  The globals() function returns a dictionary containing the variables defined in the global namespace. When globals() is called from a function or method, it returns the dictionary representing the global namespace of the module where the function or method is defined, not from where it is called.

   ----摘自:https://thepythonguru.com/python-builtin-functions/globals/

在python中,變量賦值是引用,指向相同的內容。

舉例:如圖

 

globals() 函數會以字典類型返回當前位置的全部全局變量。

Python 內置函數 locals() 和globals()

1》這兩個函數主要提供,基於字典的訪問局部變量和全局變量的方式。
python 使用叫做名字空間的東西來記錄變量的軌跡。名字空間是一個字典 ,它的鍵就是字符串形式的變量名字,它的值就是變量的實際值。
名字空間可以像 Python 的 dictionary 一樣進行訪問。
在一個 Python 程序中的任何一個地方,都存在幾個可用的名字空間。
每個函數都有着自已的名字空間,叫做局部名字空間,它記錄了函數的變量,包括函數的參數和局部定義的變量。
每個模塊擁有它自已的名字空間,叫做全局名字空間,它記錄了模塊的變量,包括函數、類、其它導入的模塊、模塊級的變量和常量。
還有就是內置名字空間, 任何模塊均可訪問它,它存放着內置的函數和異常。
2》當一行代碼要使用變量 x 的值時,Python 會到所有可用的名字空間去查找變量,按照如下順序:
局部名字空間 - 特指當前函數或類的方法。如果函數定義了一個局部變量 x, 或一個參數 x,Python 將使用它,然后停止搜索。
全局名字空間 - 特指當前的模塊。如果模塊定義了一個名為 x 的變量,函數或類,Python 將使用它然后停止搜索。
內置名字空間 - 對每個模塊都是全局的。作為最后的嘗試,Python 將假設 x 是內置函數或變量。
如果 Python 在這些名字空間找不到 x,它將放棄查找並引發一個 NameError 異常,
同時傳遞 There is no variable named 'x' 這樣一條信息.
3》名字空間在運行時直接可以訪問。局部名字空間可以通過內置的 locals 函數來訪問。全局 (模塊級別) 名字空間可以通過內置的 globals 函數來訪問。
locals 對局部 (函數) 名字空間做了些什么,globals 就對全局 (模塊) 名字空間做了什么。
然而 globals 更令人興奮,因為一個模塊的名字空間包含了模塊級的變量和常量,它還包括了所有在模塊中定義的函數和類,以及任何被導入到模塊中的東西。
4》回想一下 from module import 和 import module 之間的不同?
使用 import module,模塊自身被導入,但是它保持着自已的名字空間,
這就是為什么您需要使用模塊名來訪問它的函數或屬性: module.function 的原因。
但是使用 from module import,實際上是從另一個模塊中將指定的函數和屬性導入到您自己的名字空間,
這就是為什么您可以直接訪問它們卻不需要引用它們所來源的模塊的原因。
使用 globals 函數,您會真切地看到這一切的發生。
5》locals 是只讀的,不可修改, 而globals可以修改,原因是:
locals()實際上沒有返回局部名字空間,它返回的是一個拷貝。所以對它進行修改,修改的是拷貝,而對實際的局部名字空間中的變量值並無影響。
globals()返回的是實際的全局名字空間,而不是一個拷貝: 與 locals 的行為完全相反。
所以對 globals 所返回的 dictionary 的任何的改動都會直接影響到全局變量的取值。

例一:執行文件:python module1.py

#!/usr/bin/python3
 
from pprint import pprint
 
a = 100
b = 4
 
def foo():
    x = 100 # x is a local variable
    print(x)

pprint(globals())

輸出結果:

{'__builtins__': <module 'builtins' (built-in)>,
'__cached__': None,
'__doc__': None,
'__file__': './module1.py',
'__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7f699cab37f0>,
'__name__': '__main__',
'__package__': None,
'__spec__': None,
'a': 100,
'b': 4,
'foo': <function foo at 0x7f699ca1e2f0>,
'pprint': <function pprint at 0x7f699ca1e6a8>}
__package__這種以雙下划線開始和結束的key是python解釋器定義的。最后面的是模塊module1定義的變量:a/b/foo/pprint

例二:執行python module2.py。

模塊module1.py內容:

#!/usr/bin/python3
 
from pprint import pprint
 
a = 100
b = 4
 
def foo():
    x = 100 # x is a local variable
    pprint(globals())

模塊module2.py內容:

#!/usr/bin/python3
 
import module1
from x
= 100 y = 2 module1.foo()

輸出結果:

{'__builtins__': { ... }
'__cached__': '/home/overiq/tmp/__pycache__/module1.cpython-35.pyc',
'__doc__': None,
'__file__': '/home/overiq/tmp/module1.py',
'__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7f17b12305c0>,
'__name__': 'module1',
'__package__': '',
'__spec__': ModuleSpec(name='module1', loader=<_frozen_importlib_external.SourceFileLoader object at 0x7f17b12305c0>, origin='/home/overiq/tmp/module1.py'),
'a': 100,
'b': 4,
'foo': <function foo at 0x7f17b121d488>,
'pprint': <function pprint at 0x7f17b121d730>}

例三:執行python test1.py

test.py

# /usr/bin/env python
# -*- coding:utf-8 -*-
from pprint import pprint

a=100
b=4
c=globals()
c['var1'] = 'right'
def foo():
  x='局部變量'
  d = globals()
  d['var2'] = 'neibu'
  print x

foo()

test1.py

# /usr/bin/env python
# -*- coding:utf-8 -*-
from pprint import pprint
from test import a
from test import var1,var2
pprint(a)
pprint(var1)
pprint(var2)

輸出結果:

局部變量
100
'right'
'neibu'

 

例四:執行python test4.py。使用global聲稱為全局變量

test4.py內容:

# /usr/bin/env python
# -*- coding:utf-8 -*-
from pprint import pprint
a=2
b=4

def fun():
  global a
  a = a+1
  b=40
  pprint(a)
  pprint(b)
fun()
pprint(a)
pprint(b)

輸出結果:

3
40
3
4

 

例五:執行python test4.py。在函數中直接使用全局變量。所謂全局是指模塊test4.py內部。

test4.py內容:

# /usr/bin/env python
# -*- coding:utf-8 -*-
from pprint import pprint
a=2
b=4

def fun():
  global a
  a = a+1
  pprint(a)
  pprint(b)
fun()
pprint(a)
pprint(b)

輸出結果:

3
4
3
4

 

參考:

https://thepythonguru.com/python-builtin-functions/globals/

http://www.runoob.com/python/python-func-globals.html

https://blog.csdn.net/sxingming/article/details/52061630


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM