python中的命名空間,在使用點號.和不使用點號.兩種情況下使用變數名時,會有不同的處理方式。
賦值語句 var=value
僅僅是建立或改變當前作用域變數名,除非使用了global或者nonlocal關鍵字
引用語句 var
搜尋路徑如下:
l(local): 在當前作用域下搜尋變數名var
e: 在所有巢狀函式中搜尋,從內到外
g(global):在全域性作用域中搜尋
b(builtins): 在內建作用域中搜尋
賦值語句 object.attr=value
在當前命名空間內建立或者修改屬性值,不會啟用繼承搜尋樹。
引用語句 object.attr
啟用繼承搜尋樹,首先在當前例項中搜尋屬性attr,如果沒有找到,就到父類中去搜尋(從下至上,從左至右)
示例**
# !/usr/bin/env python
# -*- coding:utf-8 -*-
# 全域性變數(命名空間為當前模組)
var=1
def func_1():
# var引用全域性變數
print(var)
def func_2():
# 本地變數(命名空間為當前函式)
var=2
print(var)
class myclass():
# 類變數(命名空間為當前類)
var=3
def method(self):
# 本地變數(命名空間為當前方法)
var=4
# 例項變數(命名空間為當前例項)
self.var=5
if __name__ == '__main__':
print(var) # 1
func_1() # 1
func_2() # 2
print(var) # 1
myclass=myclass()
print(myclass.var) # 3
myclass.method()
print(myclass.var) # 5
print(myclass.var) # 3
global
:將被修飾的變數的作用域宣告為全域性作用域
(被宣告的變數如果不是已經存在的變數名,會自動建立
)。
nonlocal
:用於巢狀函式中,將被修飾的變數名的作用域宣告為非本地變數
(被宣告的變數必須是已經存在的變數名,不會自動建立
)。
這兩個關鍵字強制改變了屬性的作用域,以免引發潛在的問題,不推薦使用,可以用其它手段代替,
例如使用不同的變數名,而不是使用nonlocal宣告;直接宣告全域性變數,而不是在其它作用域中使用global宣告。
命名空間 總結
1.namespace解決了命名衝突問題 可以放 函式 變數 結構體 類 2.命名空間必須定義在全域性作用域下 3.命名空間可以巢狀命名空間 4.命名空間是開放的,可以隨時給命名空間新增內容。巢狀時可用 using namespace a b 匿名 命名空間 當定義乙個命名空間時,可以忽略這個命名空...
python命名空間列印 Python 命名空間
命名空間 在python直譯器開始執行 之後,就會在記憶體中開闢乙個空間,每當遇到乙個變數的時候,就 把變數名和值之間的關係記錄下來,但是當遇到函式定義的時候,直譯器只是把函式名讀入內 存,表示這個函式存在了 至於函式內部的變數和邏輯,直譯器是不關心的.也就是說一開始 的時候函式只是載入進來,僅此而...
Python 命名空間
本文介紹python中命名空間中的legb原則。legb含 釋 l local function 函式內的名字空間,包括區域性變數和形參 e enclosing function locals 外部巢狀函式的名字空間 例如closure g global module 函式定義所在模組 檔案 的名字...