python變數作用域中容易忽略的點
python中變數作用於並不陌生,函式中的是區域性變數,先看一個小例子:
In [1]: def f1(a):
...: print(a)
...: print(b)
呼叫
f1(3)
很明顯這個會報錯
NameError Traceback (most recent call last)
<ipython-input-3-a636accabfae> in <module>()
----> 1 f1(3)
<ipython-input-1-8c139ea215ce> in f1(a)
1 def f1(a):
2 print(a)
----> 3 print(b)
4
NameError: name 'b' is not defined
這時我們需要新增對b的賦值操作
b = 5
在執行一下
In [5]: f1(3)
3
5
說明在執行函式時函式會去全域性變數中找b的值
這點明白之後我們再來看一個讓人有點吃驚的例子:
In [6]: b = 6
In [7]: def f1(a):
...: print(a)
...: print(b)
...: b = 9
看完函式你一定會覺得列印時候b應該顯示6吧,我們看看結果
UnboundLocalError Traceback (most recent call last)
<ipython-input-8-a636accabfae> in <module>()
----> 1 f1(3)
<ipython-input-7-b4880e75da42> in f1(a)
1 def f1(a):
2 print(a)
----> 3 print(b)
4 b = 9
5
UnboundLocalError: local variable 'b' referenced before assignment
什麼?報錯了,顯示本地變數在賦值前使用!
事實是:python編譯函式的定義體時,判斷b是區域性變數,所以在執行時會獲取b之前沒有定義,所以報錯,我們將b的定義放到列印之前就好了,這恰恰說明了python呼叫的過程順序,先區域性,後全域性。
還有一種解決辦法就是在使用b之前使用global宣告b要用全域性變數裡面的
如果還想進一步看看直譯器的載入內容,可以使用python的dis模組來檢視,過程更加清晰。
相關文章
- python變數與變數作用域Python變數
- 全域性作用域中,用const和let宣告的變數去哪了?變數
- Python中容易被忽略的內建型別Python型別
- Python裡__all__變數的作用Python變數
- Flutter 中的 ListView 的一個容易忽略的知識點FlutterView
- vue-router 一些容易被忽略的知識點Vue
- 前端面試中容易讓你忽略的知識點(一)前端面試
- Vue中那些容易被忽略的~Vue
- 【MySQL】最容易忽略的常識MySql
- SQL Server 容易忽略的錯誤SQLServer
- Python 程式設計師容易忽略的程式設計方式Python程式設計師
- Python 函式和變數作用域Python函式變數
- oracle中容易忽略的後臺程式Oracle
- Python迴圈語句中的索引變數作用域Python索引變數
- lisp 變數的作用域Lisp變數
- 變數作用域變數
- 8個容易被忽略但不能忽略的SD-WAN功能-VecloudCloud
- 記Promise一個容易被忽略的特性Promise
- 軟體測試中容易忽略的缺陷
- c++ 類作用域中的名字查詢C++
- Python函式引數傳遞以及變數作用域Python函式變數
- java中變數的作用域Java變數
- JavaScript 變數的作用域鏈JavaScript變數
- Oracle中最容易被忽略的那些實用特性Oracle
- 後臺設計中容易被忽略的坑
- H5 data-*容易忽略的問題H5
- 捋一捋容易被忽略的API用法API
- JS變數作用域JS變數
- SCSS 變數作用域CSS變數
- golang變數作用域Golang變數
- javascript 函式作用域中的關鍵字this的指向JavaScript函式
- 『無為則無心』Python函式 — 30、Python變數的作用域Python函式變數
- 基礎 變數的作用範圍變數
- 現代 JavaScript 的變數作用域JavaScript變數
- Go語言中的變數作用域Go變數
- Shell變數的作用域問題變數
- 變數的作用域--js閉包變數JS
- 理解 Javascript 中變數的作用域JavaScript變數