寫在最前面: python
python中全局變量和局部變量的最大區別在於局部變量只能經過函數去訪問,而全局變量能夠直接訪問。bash
!!! 函數
咱們先來看一個最簡單的例子,事實上這並非一個真正的全局變量,只是在類中的一個變量。 ui
!!! spa
咱們先從類中的變量訪問開始講起 那麼咱們要如何訪問這個變量呢?
code
class variable:
a = '我是類變量'
def showvarible(self):
b = '我是函數變量'
print(a)
print(b)
variable().showvarible()複製代碼
毫無疑問,編譯器就已經報錯了,這是由於類中的變量不能夠在函數中直接訪問,應該這樣
leetcode
class variable:
a = '我是類變量'
def showvarible(self):
b = '我是函數變量'
print(variable.a)
print(b)
variable().showvarible()複製代碼
我是類變量
我是函數變量複製代碼
其實咱們還能夠經過self去訪問
字符串
class variable:
a = '我是類變量'
def showvarible(self):
b = '我是函數變量'
print(self.a)
print(b)
variable().showvarible()複製代碼
結果是同樣的
編譯器
我是類變量
我是函數變量複製代碼
還能夠怎麼作呢,咱們經過構造函數給定一個參數,類中可訪問
string
class variable:
def __init__(self,a):
self.a = '我是類變量'
def showvarible(self):
b = '我是函數變量'
print(self.a)
print(b)
variable(1).showvarible()複製代碼
我是類變量
我是函數變量複製代碼
這裏須要注意的是,實例化的時候必須給參數,因爲python是動態語言,不須要指定參數的類型,你能夠放int,好比1,也能夠給一個字符串。
而後咱們真正看一下全局變量
a = '我是真正的全局變量'
def showvariable():
b = '我一直都是局部變量'
print(a)
print(b)
showvariable()複製代碼
我是真正的全局變量
我一直都是局部變量複製代碼
當咱們試圖在函數外訪問這個函數的局部變量時
a = '我是真正的全局變量'
def showvariable():
b = '我一直都是局部變量'
print(a)
def showb():
print(b)
showvariable()複製代碼
報錯
我是真正的全局變量
Traceback (most recent call last):
File "F:/leetcode/xxx.py", line 13, in <module>
showb()
File "F:/leetcode/xxx.py", line 9, in showb
print(b)
NameError: name 'b' is not defined複製代碼
說明局部變量只能在局部使用。
那麼不巧的是,個人局部變量和全局變量定義了同一個名稱,誰的優先級更高呢?
a = '我是真正的全局變量'
def showvariable():
a = '我一直都是局部變量'
print(a)
print(a)
showvariable()複製代碼
果真,函數優先使用了局部變量
而優先級還有一個體現,來看下面的例子
a = 3
def showvariable():
a = a * 5
print(a)
showvariable()複製代碼
你可能會認爲輸出15,可是上面的一個例子告訴咱們,在函數內會優先使用局部變量
3
Traceback (most recent call last):
File "F:/leetcode/xxx.py", line 10, in <module>
showvariable()
File "F:/leetcode/xxx.py", line 5, in showvariable
a = a * 3
UnboundLocalError: local variable 'a' referenced before assignment複製代碼
這樣是由於,咱們在函數內定義了一個局部變量a,可是還沒來得及賦值,就被*5,編譯器不知道拿誰去*5,固然報錯了。
下面講講global,global第一次是隻能定義不能賦值的
def showvariable():
global a
a = '我是global'
print(a)
showvariable()複製代碼
我是global複製代碼
固然是能夠在函數外訪問的
def showvariable():
global a
a = '我是global'
print(a)
def showglobal():
print(a)
showvariable()
showglobal()複製代碼
複製代碼
我是global
我是global複製代碼
可是,必須賦值後纔有意義,若是像這樣
def showvariable():
global a
a = '我是global'
print(a)
def showglobal():
print(a)
print(a)
showvariable()
showglobal()複製代碼
在沒有賦值的時候,就去打印
Traceback (most recent call last):
File "F:/leetcode/xxx.py", line 9, in <module>
print(a)
NameError: name 'a' is not defined複製代碼
由於此時global a尚未賦值,固然不能打印。