如圖,我先定義了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。


推薦閱讀:
相关文章