python命名空間

2021-10-01 10:06:00 字數 2941 閱讀 5255

變數是擁有匹配物件的名字(識別符號)。命名空間是乙個包含了變數名稱們(鍵)和它們各自相應的物件們(值)的字典。

乙個 python 表示式可以訪問區域性命名空間和全域性命名空間裡的變數。如果乙個區域性變數和乙個全域性變數重名,則區域性變數會覆蓋全域性變數。

每個函式都有自己的命名空間。類的方法的作用域規則和通常函式的一樣。

python 會智慧型地猜測乙個變數是區域性的還是全域性的,它假設任何在函式內賦值的變數都是區域性的。

因此,如果要給函式內的全域性變數賦值,必須使用 global 語句。

global varname 的表示式會告訴 python, varname 是乙個全域性變數,這樣 python 就不會在區域性命名空間裡尋找這個變數了。

例如,我們在全域性命名空間裡定義乙個變數 money。我們再在函式內給變數 money 賦值,然後 python 會假定 money 是乙個區域性變數。然而,我們並沒有在訪問前宣告乙個區域性變數 money,結果就是會出現乙個 unboundlocalerror 的錯誤。取消 global 語句前的注釋符就能解決這個問題。

#!/usr/bin/python

# -*- coding: utf-8 -*-

money = 2000

def addmoney():

# 想改正**就取消以下注釋:

# global money

money = money + 1

print money

addmoney()

print money

dir() 函式乙個排好序的字串列表,內容是乙個模組裡定義過的名字。

#!/usr/bin/python

# -*- coding: utf-8 -*-

# 匯入內建math模組

import math

content = dir(math)

print content;

以上例項輸出結果:

['__doc__', '__file__', '__name__', 'acos', 'asin', 'atan', 

'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp',

'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log',

'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh',

'sqrt', 'tan', 'tanh']

在這裡,特殊字串變數__name__指向模組的名字,__file__指向該模組的匯入檔名。

根據呼叫地方的不同,globals() 和 locals() 函式可被用來返回全域性和區域性命名空間裡的名字。

如果在函式內部呼叫 locals(),返回的是所有能在該函式裡訪問的命名。

如果在函式內部呼叫 globals(),返回的是所有在該函式裡能訪問的全域性名字。

兩個函式的返回型別都是字典。所以名字們能用 keys() 函式摘取。

當乙個模組被匯入到乙個指令碼,模組頂層部分的**只會被執行一次。

因此,如果你想重新執行模組裡頂層部分的**,可以用 reload() 函式。該函式會重新匯入之前匯入過的模組。語法如下:

reload(module_name)
在這裡,module_name要直接放模組的名字,而不是乙個字串形式。比如想過載 hello 模組,如下:

reload(hello)
包是乙個分層次的檔案目錄結構,它定義了乙個由模組及子包,和子包下的子包等組成的 python 的應用環境。

簡單來說,包就是資料夾,但該資料夾下必須存在 __init__.py 檔案, 該檔案的內容可以為空。__init__.py用於標識當前資料夾是乙個包。

考慮乙個在package_runoob目錄下的runoob1.py、runoob2.py、__init__.py檔案,test.py 為測試呼叫包的**,目錄結構如下:

test.py

package_runoob

|-- __init__.py

|-- runoob1.py

|-- runoob2.py

源**如下:

#!/usr/bin/python # -*- coding: utf-8 -*- def runoob1(): print "i'm in runoob1"

#!/usr/bin/python # -*- coding: utf-8 -*- def runoob2(): print "i'm in runoob2"

現在,在package_runoob目錄下建立__init__.py

#!/usr/bin/python # -*- coding: utf-8 -*- if __name__ == '__main__': print '作為主程式執行' else: print 'package_runoob 初始化'

然後我們在package_runoob同級目錄下建立 test.py 來呼叫package_runoob

#!/usr/bin/python # -*- coding: utf-8 -*- # 匯入 phone 包 from package_runoob.runoob1 import runoob1 from package_runoob.runoob2 import runoob2 runoob1() runoob2()

以上例項輸出結果:

package_runoob 初始化

i'm in runoob1

i'm in runoob2

如上,為了舉例,我們只在每個檔案裡放置了乙個函式,但其實你可以放置許多函式。你也可以在這些檔案裡定義python的類,然後為這些類建乙個包。

Python 命名空間

本文介紹python中命名空間中的legb原則。legb含 釋 l local function 函式內的名字空間,包括區域性變數和形參 e enclosing function locals 外部巢狀函式的名字空間 例如closure g global module 函式定義所在模組 檔案 的名字...

python 命名空間

作用域 第五章說過,將輸入字元作為命令放在作用域字典裡 作用域,每個函式都有乙個作用域,就是 字典,字典名字為函式名,鍵為變數,鍵值為變數對應的賦值。函式的作用域為區域性作用域 在函式內部訪問全域性變數,且只是讀取變數的值不重新繫結變數。這樣引用易出錯誤。慎重使用全域性變數 defcombine p...

python命名空間

區域性命名空間下def foo a a if name main foo 報錯資訊 unboundlocalerror local variable a referenced before assignment 全域性命名空間下if name main b b報錯資訊 nameerror name ...