13.1 函式中的變數
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檔案然後整合到一起,此時就有可能會因為全域性變數重名造成變數的值覆蓋的情況出現。
相關文章
- 函式外與函式內的變數函式變數
- test函式中的區域性變數函式變數
- 關於javascript中變數及函式的提升JavaScript變數函式
- 函式內部的變數提升函式變數
- python---函式引數、變數Python函式變數
- 隨機變數函式的分佈隨機變數函式
- PHP 函式可變數量的引數列表PHP函式變數
- Javascript 函式和變數提升JavaScript函式變數
- python函式變長引數Python函式
- 十二、變數作用域:區域性變數、全域性變數,函式版名片管理系統—新增函式文件變數函式
- 程式中的函式引數函式
- 函式呼叫引數變數傳值的問題函式變數
- 外層函式的變數直接被巢狀函式引用計算函式變數巢狀
- JavaScript 變數與函式宣告前置JavaScript變數函式
- Python 函式和變數作用域Python函式變數
- JS——變數提升和函式提升JS變數函式
- task04 變數與函式變數函式
- Go函式接收可變引數Go函式
- 變數(函式)命名最佳實踐變數函式
- golang中http server.go中的testHookServerServe函式變數寫法問題GolangHTTPServerHook函式變數
- §3. 復變數的指數函式·尤拉公式變數函式公式
- 關於變數的宣告和定義、內部函式和外部函式變數函式
- 函式(三)作用域之變數作用域、函式巢狀中區域性函式作用域、預設值引數作用域函式變數巢狀
- 揭秘 Go 中的函式引數Go函式
- makefile--變數與函式的綜合示例變數函式
- javascript之變數提升與函式提升JavaScript變數函式
- JS變數宣告和函式宣告提升JS變數函式
- Go 入門 – 包,函式和變數Go函式變數
- 遞迴函式,可變引數列表遞迴函式
- JavaScript 判斷變數是否是函式JavaScript變數函式
- 複數與複變函式選題函式
- Task 04 變數與函式 Variables and Functions變數函式Function
- 深入理解js的變數提升和函式提升JS變數函式
- Swift 呼叫 Objective-C 的可變引數函式SwiftObject函式
- vertica 中位數函式 MEDIAN 的使用函式
- python中函式的引數傳遞Python函式
- thinkphp 輸出變數使用函式處理PHP變數函式
- 深入理解變數提升和函式提升變數函式
- js變數與函式常識學習JS變數函式