13.1 函式中的變數

大牧莫邪發表於2017-05-19

1. 函式中的變數

在函式中,我們可以看到也進行了變數的使用,那函式中的變數和函式外的變數到底有什麼區別呢?

1.1. 全域性變數的定義

宣告在函式外面的變數,可以在文件的任意地方使用這個變數,我們稱為全域性變數 關於全域性變數,使用方式如下 ```

# 定義在函式外部的變數
name = "tom"
# 直接使用全域性變數
print(tom)
# if程式碼塊中使用全域性變數
print(tom)
# 函式中使用全域性變數
def test():
    print(tom)   # tom

```

1.2. 函式中使用全域性變數

上面程式碼的輸出結果,都是tom,表示全域性變數一旦宣告賦值,在任何地方都可以使用 但是如果我們要在函式中修改變數的值,就會出現如下的問題 ```

name = "tom"
def test():
    name = "jerry"
    print(name)   # jerry
test()
print (name)   # tom
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# 執行上述程式,我們會發現,即時函式執行了,在函式中name輸出jerry
# 但是,在函式外部,我們重新列印name的值,發現name的值還是tom
# 
# 此時:函式中的name是區域性變數,函式外部的name是全域性變數
# 如此詭異的情況,也是python為了避免出現開發人員在操作函式的過程中
# 如果不明確是否使用全域性變數的情況下,無意中覆蓋全域性變數的值
#
# 所以,在函式中使用全域性變數,必須顯示的宣告使用哪個全域性變數
# 語法是:global 變數名
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
name = "tom"
def test():
    global name
    name = "jerry"
    print(name)  # jerry
test()
print(name)  # jerry
```
####1.3. 函式中的變數隔離
如果函式中沒有通過global引入全域性變數,但是在函式中又使用了和全域性變數相同的名稱
此時就會出現問題
```
name = "tom"
def test():
    # 這裡只是想使用一下全域性變數的值
    print(name)   
    # n行程式碼之後,又宣告瞭區域性變數name
    # 此時一旦宣告瞭區域性變數,上面列印的程式碼就會出現錯誤
    name = "jerry" 

test()
執行結果:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in test
UnboundLocalError: local variable 'name' referenced before assignment

```

上面的錯誤,主要是變數提升引起的錯誤,首先描述一下錯誤出現的條件 1.如果函式中沒有宣告和全域性變數名稱一致的區域性變數,函式中直接使用全域性 變數的值,不會出現錯誤 2.如果函式中,一旦在任意位置定義了和全域性變數名稱一致的區域性變數,函式中 在區域性變數宣告定義之前使用這個名稱的變數,就會出現上述錯誤

這是因為,在函式中,一旦宣告變數並且賦值一個區域性變數,函式中又沒有通過 global引入同名的全域性變數,此時在函式中只會存在區域性變數~不允許使用全域性變數 此時如果在同名的區域性變數宣告賦值之前使用這個變數,就會出現錯誤。

1.2. 區域性變數

宣告在函式內部的變數,只能在函式內部使用,函式執行結束這個變數就會被回收,我們稱為區域性變數。區域性變數只是在函式中可以使用,出了函式這個變數就不認識了 ```

def test():
    name = "tom" # 這是一個test函式中的區域性變數

test()
print(name) 
# 執行結果
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'name' is not defined # 出現錯誤,name沒有定義

``` 通常情況下,函式內部宣告賦值的變數和函式的引數都會當成區域性變數進行處理

全域性變數和區域性變數: 幾乎所有的程式語言中都有全域性變數和區域性變數的區分,同時我們在開發過程中,也需要儘量避免頻繁使用全域性變數 原因之一全域性變數一經使用就常駐記憶體,如果全域性變數中資料過於龐大就會導致記憶體溢位程式崩潰的情況 原因之二是全域性變數在使用的過程中容易造成變數的全域性汙染,因為在專案開發過程中通常是多個人協同開發多個Python檔案然後整合到一起,此時就有可能會因為全域性變數重名造成變數的值覆蓋的情況出現。

相關文章