小白求解答
為什么這樣會出現變量未定義:
def calc_prod(list):
? ? s=1.0 在python的函數中和全局變量同名的變量,如果有修改變量的值就會變成局部變量,在修改之前對該變量的引用自然就會出現沒有定義的錯誤
? ? def lazy_prod():
? ? ? ? for i in list:
? ? ? ? ? ? s=s*i
? ? ? ? return s
? ? return lazy_prod
f=calc_prod([1,2,3,4])
f
f()
而這樣卻不會呢?
def count():
? ? fs=[]
? ? for i in range(1,4):
? ? ? ? def f():
? ? ? ? ? ? return i*i
? ? ? ? fs.append(f)
? ? return fs
f1,f2,f3=count()
f1(),f2(),f3()
2019-05-12
Python中的數據類型分為“不可變數據類型”和“可變數據類型”,不可變數據類型更改后地址發生改變,可變數據類型更改地址不發生改變。不可變數據類型,不允許變量的值發生變化,如果改變了變量的值,相當于是新建了一個對象。列表屬于可變數據類型,浮點數屬于不可變數據類型。
而 s = s*i??? 是先調用等號右邊 s*i 中的s,此時系統會新建一個名為s的對象,s將不再指向原來的1,后面也沒有對s的賦值操作,因此此時s并沒有值,所以會報未定義的錯誤。列表是可變數據類型,運用append之后并不會創建新的對象,因此還是原來的那個對象。
至于你說的“在python的函數中和全局變量同名的變量,如果有修改變量的值就會變成局部變量,在修改之前對該變量的引用自然就會出現沒有定義的錯誤”,這句話應該是有問題的,如果有修改,則會創建新的對象指向新的地址,而不是簡單地從全局變局部。下面這段代碼就沒有任何問題,因為它沒有對變量進行修改,只是單純的引用了變量:
x = 1
def function1():
?? ?return x
print function1()