1. 程式人生 > >Python globals() locals() vars() 三個內建函數的區別

Python globals() locals() vars() 三個內建函數的區別

https 聲明 usr object index 函數 targe outer ref

首先參考官方文檔對這三個函數的介紹:

2. Built-in Functions – Python3.5

1、globals()

返回當前全局符號表, 通常是返回當前模塊下的全局符號表, 比如全局內建的函數,以及模塊裏的全局符號(定義聲明的變量,類, 實例等), 在函數或者類方法中, globals()返回的模塊符號表 是其所在模塊, 而不是調用模塊.

2、locals()

更新並以字典形式返回當前局部符號表. 自由變量由函數塊的locals() 返回, 而不會由 class 塊來返回. 需要註意的是, locals() 字典不應該被修改; 在解釋器中對修改行為可能對 local 值或者自由變量無效.

3、vars()

返回 __dict__ 屬性, 比如模塊, 類, 實例, 或者其他 帶有 __dict__ 屬性的 object. 比如 模塊和實例擁有可更新的 __dict__ 屬性;然而其他 objects 可能會對 __dict__ 屬性的寫操作限制(例如 類使用 dictproxy 阻止直接對字典更新).vars() 如果不傳參數, 那麽作用與 locals() 一樣. 需要註意的是, locals 字典只在讀操作時使用, 因為對 locals 的更新會被忽略.

4、舉例

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#

HELLO 
= 1 # GLOABLS 字典值包含 __builtins__, __doc__等通用的全局內建函數,模塊, # 以及剛才定義的 HELLO GLOABLS = globals() print("outer-global-{}".format(GLOABLS)) LOCALS = locals() # 此時與 globals() 是等價的!! print("outer-locals-{}".format(LOCALS)) # globals 和 locals 此時是等價的, GLOBALS 和 LOCALS 其實是指向一個引用 LOCALS[B] = 1 # VARS 的引用與 GLOABLS LOCALS 一樣, 可用 id() 來證實.
VARS = vars() class A(object): # 此時的 locals 是 class 塊的 locals, 擁有 A_LOCALS A_GLOBALS 值 A_LOCALS = locals() # 與 GLOBALS 等價 A_GLOBALS = globals() def __init__(self): self.func_locals = None self.func_globals = None def func(self): self.func_locals = locals() self.func_globals = globals() # 即 GLOBALS 值 a = A() a.func() print("instance-globals-{}".format(a.A_GLOBALS)) print("instance-locals-{}".format(a.A_LOCALS)) a_vars = vars(a) # 返回實例的 __dict__, 等價於 a_vars = a.__dict__ # print(a_vars) A_DICT = vars(A) # 返回類的 dictproxy, 不能對其key直接操作賦值. print(A_DICT) a_vars[func_vars] = "vars" #print(a.func_vars) # "vars"

Python globals() locals() vars() 三個內建函數的區別