python中為什麼定義函數裡面設置的變數不可用?
如圖,我先定義了what函數,the2是用argv輸入的,然後我再運行do函數,理論上我在what里已經定義了file,而且比do先運行,但卻出錯說我沒定義,這樣定義是不能保存的嗎?
上面的朋友已經把根本的問題說清楚了,就是作用域的問題。
其實也有別的解決方案:
1、設置全局變數
def test# _1(a):
global b
b = a +1
print(b)
def test_2(c):
c = b + 2
print(c)
test_1(1)
2
test_2(2)
4
2、嵌套函數
def fun_1(a):
b = a+1
print(b: ,b)
def fun_2(c):
d = c+b
print(d: ,d)
fun_2(b)
fun_1(1)
b: 2
d: 4
但是!!兩種方法都不推薦!!
問題是個好問題,Python有個作用域問題。LEGB local ensure global build
因為在函數里定義的變數僅作用於本函數!變數都是有作用域的,就像這裡的file作用域僅在what這個方法里,出了這個函數,file就不存在了,即未定義!如果要問題里在do函數里使用file的話,應該把file移到方法外,定義成全局變數,局部里用global聲明下要修改全局變數,而且open的時候應該為w+,不然後面無法read,修改如下:
file = None
def what(the2):
global file
file = open(the2, 『w+』)
……
函數內定義的是局部變數,只在函數內生效。
是作用域的問題,詳細解釋可以看這裡:
Python3 命名空間和作用域?www.runoob.com
仔細看完就知道原因了,希望對你有幫助。
其他人都說了。函數裡面能用外面的變數。反過來不行。
但值得注意的是
如果函數裡面對某個變數賦了值,那麼這個變數就被認定是函數裡面定義的變數了。
這個判定是完全是靜態的。只要是用了=賦值號,就算他是出現在了if 0:分支這樣永遠無法被運行到的地方。
對了。+= def import這樣的也是相當於是賦值了。
在這時,你會發現你給一個列表append和+=造成的結果就不一樣了。
(@靈劍 希望我沒說錯吧
先了解一下 變數作用域把,函數內定義的變數,其作用域只能在本函數內部使用。
函數內定義的變數只作用於這個函數,也就是局部變數。如果要在其他地方使用,需要傳遞過去。
函數外定義一個global的變數,在函數內就可以直接用了
在函數內部先聲明file為global。
推薦閱讀: