def multipliers(n):
funcs =
for i in range(n):
def f(x):
return x * i
return funcs
g0, g1, g2, g3 = mutipliters(4)
print(g0(10)) # 30
print(g1(10)) # 30
print(g1(10)) # 30
print(g1(10)) # 30
被同學問道如上問題, 為什麼,生成的4個函式.最終返回的值一樣.
檢視了四個函式的記憶體位址,是不同的記憶體位址.
說明四個函式,是不同的函式.不是因為函式明重複,導致了覆蓋的問題
那就是說明 i 值的問題.
列印出四個函式呼叫時,i 的值,發現都是3,
但是, 沒有迴圈發生,所以是直接訪問了i的值
於是檢視了 四個函式掉用時, i 的id, id(i)的值相同. 發現是同乙個記憶體位址.
也就是說函式呼叫的時候,是動態取 i 所在位址裡面的值, 而在生成函式range結束的時候,i 的值 已經不變了.所以出現了以上問題.
查詢了一些結論,最終如下結論:
python裡, 非區域性變數繫結的是空間, 而不是值本身,所以,生成的函式i, 相對於函式f 來說, 是全域性變數, 所以繫結的是 i 所在的記憶體位址.
所以導致了,生成的四個函式所得值時相同的.
def multipliers(n):
funcs =
for i in range(n):
def f(x, m=i): #每次生成函式, i的值, 都被繫結到函式本身
return x * m
return funcs
g0, g1, g2, g3 = mutipliters(4)
print(g0(10)) # 0
print(g1(10)) # 10
print(g1(10)) # 20
print(g1(10)) # 30
有興趣的可以查詢一下 python 延遲繫結和閉包的問題~
ps: 為什麼將 x 換成 *arg, 出現如下情況???
def multipliers(n):
funcs =
for i in range(n):
def f(*arg): #每次生成函式, i的值, 都被繫結到函式本身
return arg * i
return funcs
g0, g1, g2, g3 = mutipliters(4)
print(g0(10)) # (10, 10, 10)
目前不明白~歡迎賜教
Linux的核心延遲函式
當核心需要等待乙個比較短的時間間隔時,比方說 有時候裝置驅動器會等待預先定義的若干個微妙的時間直到硬體完成某些操作。由於動態定時器通常有很大的設定開銷和乙個相當大的最小等待時間 1ms 所以裝置驅動器使用它會很不方便。在這些情況下,核心使用udelay 和ndelay 函式 前者接收乙個微妙級的時間...
函式 延遲呼叫的用途
在設計層面錯誤和異常代表了兩種概念,實現上沒有抽象概念,異常和錯誤實際上是抽象層面的事情。假設錯誤代表了意外,那麼異常可以理解一種可控的意外。從 cpu 什麼或者從彙編層面上來說,不存在錯誤和異常。因為哪怕就是乙個浮點計算錯誤或許被零除 cpu 實際上作業系統對這個事情都是有預案的,它並沒有導致計算...
Python延遲載入
python裡面的延遲載入用得非常多,其主要思想是延遲所要引入類的例項化,節省一些初始化所需要的時間和空間。這種思想在django中應用得也是非常廣泛,比如orm的queryset,還有鑑權中介軟體中的request.user等等,這些都是利用了延遲載入的思想。本文就是通過例子來分析延遲載入的思想。...