亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

小白求解答

為什么這樣會出現變量未定義:

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()


正在回答

1 回答

Python中的數據類型分為“不可變數據類型”和“可變數據類型”,不可變數據類型更改后地址發生改變,可變數據類型更改地址不發生改變。不可變數據類型,不允許變量的值發生變化,如果改變了變量的值,相當于是新建了一個對象。列表屬于可變數據類型,浮點數屬于不可變數據類型。

而 s = s*i??? 是先調用等號右邊 s*i 中的s,此時系統會新建一個名為s的對象,s將不再指向原來的1,后面也沒有對s的賦值操作,因此此時s并沒有值,所以會報未定義的錯誤。列表是可變數據類型,運用append之后并不會創建新的對象,因此還是原來的那個對象。

至于你說的“在python的函數中和全局變量同名的變量,如果有修改變量的值就會變成局部變量,在修改之前對該變量的引用自然就會出現沒有定義的錯誤”,這句話應該是有問題的,如果有修改,則會創建新的對象指向新的地址,而不是簡單地從全局變局部。下面這段代碼就沒有任何問題,因為它沒有對變量進行修改,只是單純的引用了變量:

x = 1
def function1():
?? ?return x
print function1()


0 回復 有任何疑惑可以回復我~
#1

寶慕林6305465 提問者

謝謝你,我再好好參透一下
2019-05-13 回復 有任何疑惑可以回復我~
#2

寶慕林6305465 提問者

我想再問一下‘而 s = s*i 是先調用等號右邊 s*i 中的s,此時系統會新建一個名為s的對象,s將不再指向原來的1,后面也沒有對s的賦值操作,因此此時s并沒有值,所以會報未定義的錯誤。’這句話不是已經對新建的s賦值s=s*i了嗎?為什么還是未賦值呢?難道s=s*i只是創建一個s變量嗎?s變量并沒有指向具體的值嗎?
2019-05-13 回復 有任何疑惑可以回復我~
#3

荼灬 回復 寶慕林6305465 提問者

s = s*i,你企圖改變s的值,編譯器先創建一個名為s 的對象,并且將s指空,也就是等號右邊的s指空。實際上這個時候數值1的地址已經被回收(你再也找不到1了),也就是說左邊的s在賦值給右邊的s之前,自己就已經指空了,然后這個等號的作用就是將一個空值賦給另一個空值,所以系統會認為你沒有給s變量賦值
2019-05-13 回復 有任何疑惑可以回復我~
#4

寶慕林6305465 提問者 回復 荼灬

謝謝你,你好厲害,學到了
2019-05-13 回復 有任何疑惑可以回復我~
查看1條回復

舉報

0/150
提交
取消
python進階
  • 參與學習       255563    人
  • 解答問題       3038    個

學習函數式、模塊和面向對象編程,掌握Python高級程序設計

進入課程

小白求解答

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號