Python命名空間總結 「命名空間之禪」

2021-08-14 11:08:22 字數 1653 閱讀 9991

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 函式定義所在模組 檔案 的名字...