非常感謝IT邦可以讓我PO文詢問 , 最近成為python的初心者 ,
正在自學 , 有一點疑問...
簡單python LEGB 邏輯求助... 請問各位大大知道 為什麼圖中:
def len(in_var):
print("called my len() function: ", end="")
l = 0
for i in in_var:
l += 1
return l
裡面都沒有呼叫到a , 卻會算出14這個字數麻?
a = 'global'
def outer():
def len(in_var):
print('called my len() function: ', end="")
l = 0
for i in in_var:
l += 1
return l
a = 'local'
def inner():
global len
nonlocal a
a += ' variable'
inner()
print('a is', a)
print(len(a))
outer()
print(len(a))
print('a is', a)
感謝各位大大回答!
以 "裡面都沒有呼叫到a , 卻會算出14這個字數麻?" 來看
14 是從 outer()
內的 print(len(a))
而來len(a)
就是 len(in_var)
,裡面的變數 in_var
以 a
帶入
因此是有把 a
帶入的
a
在更前面的 inner()
已經變成 local variable
因此會是 14
len() 是 python 內部自帶取得 list 長度的函式,不可以用來單做自己命名的函式名稱及變數名稱
另外發問請善用程式碼區塊 (上方編輯選項 "</>" 字樣),會比較有人願意回復
你這個疑問你有以下幾個方向的知識必須熟悉,你可以由上往下進行Google或者提問或者看Python的官方文件
https://docs.python.org/zh-tw/3/
len(data)函式:python的內建函式,可以回傳data的資料長度或者說是元素個數。但數字過大會引發Error必須注意
函式的定義以及使用方式:def 了一個函式之後該如何正確地去使用他,例如你現在在def裡面又def了一個函式之後要怎麼樣正確地調用他,老實說這個寫法對於不熟悉的人坑很大。你先熟用一層def的用法。
def a(cc):
def len(cc):
print(cc)
len(cc)
a(123)#會輸出123
print(len("12345"))#會輸出5
↑你先理解這是怎麼發生的再這樣寫
全域變數與區域變數:何為global?何為local?何為nonlocal?詳細文件裡面可以看得到,你可以實作看看
網路上滿多初級的教學,建議可以先多看看
以上先這樣,有問題可以再提問~
感謝您的回應. 關於您貼出來的程式碼 , 我已經理解 LEGB 的調用邏輯. 不過問題還是我貼的這個... 為何這串def 裡面沒有調用到"a" 這個name, 卻可以算出字數?
def len(in_var):
print("called my len() function: ", end="")
l = 0
for i in in_var:
l += 1
return l
提醒: 問題的重點是調用, 不是字數~~
這個問題在於你調用了outer()之後程式執行的流程:
因為12行,a變成"localAAAX"
執行了inner(),因為有執行nonlocal a,要不然你在執行a+=那一串東西時就會報錯
所以a變成"local@#$E%SSD"的
接下來執行print("a is",a)所以幫你把a那串東西進行輸出
重點
你執行了print(len(a))
這個len是你自訂的len,而你的len()裡面有print()所以輸出了call......function:
而你的end=''導致句子還沒進行換行
注意這邊還沒有19,你的19不是這邊來的
接下來計算你的len裡的for迴圈迭代了19次,所以你的l會被加到19,被return回去print(「len(a)」)(注意中文括弧裡的東西)
所以變成print(19),所以輸出19,最後才變成
call......function: 19
我個人比較好奇,為啥會寫出這個神奇的玩意兒....
參考下圖
或許較有幫助了解
a = 'global'
def outer():
def len(in_var):
print('called len() function where [in_var={x}]'.format(x=in_var))
l = 0
for i in in_var:
l += 1
return l
a = 'local'
def inner():
global len
nonlocal a
a += ' variable'
inner()
print('[a in class outer] after [inner()] is [{x}]'.format(x=a))
print('so the length is',len(a))
outer()
print('[a in main process] is [{x}]'.format(x=a))
print('so the length is',len(a))