默認參數的坑
定義一個函數,傳入一個list,添加一個end再返回
1
2
3
|
def
add_end(L
=
[]):
L.append(
'END'
)
return
L
|
正常調用時,結果似乎不錯
1
|
print
add_end([
1
,
2
,
3
])
#[1, 2, 3, 'END']
|
使用默認參數調用時,一開始結果也是對的,但是再次調用時,結果就不對了
1
2
3
4
5
|
print
add_end()
#['END']
print
add_end()
#['END', 'END']
print
add_end()
#['END', 'END', 'END']
|
從上述調用結果發現,函數每次都記住了上次添加了‘END’后的list,python函數在定義的時候,默認參數L的值就被計算出來了即[],因為默認參數L也是一個變量,它指向對象[],每次調用該函數,如果改變 了L的內容,則下次調用時,默認參數的內容就變了,不再是函數定義時的[]了
所以,定義默認參數要牢記一點:默認參數必須指向不變對象
修改上面的例子,可以用None這個不變對象來實現
1
2
3
4
5
|
def
add_end2(L
=
None
):
if
L
is
None
:
L
=
[]
L.append(
'END'
)
return
L
|
無論調用多少次都沒問題
1
2
3
4
5
6
|
print
add_end2()
print
add_end2()
print
add_end2()
#['END']
#['END']
#['END']
|
不變對象一旦創建,對象內部的數據就不能修改,這樣就減少了由於修改數據導致的錯誤。此外,由於對象不變,多任務環境下同時讀取對象不需要加鎖,同時讀一點問題都沒有。我們在編寫程序時,如果可以設計一個不變對象,那就盡量設計成不變對象。
不可變(immutable):int、字符串(string)、float、(數值型number)、元組(tuple)
可變(mutable):字典型(dictionary)、列表型(list)
默認參數的坑
定義一個函數,傳入一個list,添加一個end再返回
1
2
3
|
def
add_end(L
=
[]):
L.append(
'END'
)
return
L
|
正常調用時,結果似乎不錯
1
|
print
add_end([
1
,
2
,
3
])
#[1, 2, 3, 'END']
|
使用默認參數調用時,一開始結果也是對的,但是再次調用時,結果就不對了
1
2
3
4
5
|
print
add_end()
#['END']
print
add_end()
#['END', 'END']
print
add_end()
#['END', 'END', 'END']
|
從上述調用結果發現,函數每次都記住了上次添加了‘END’后的list,python函數在定義的時候,默認參數L的值就被計算出來了即[],因為默認參數L也是一個變量,它指向對象[],每次調用該函數,如果改變 了L的內容,則下次調用時,默認參數的內容就變了,不再是函數定義時的[]了
所以,定義默認參數要牢記一點:默認參數必須指向不變對象
修改上面的例子,可以用None這個不變對象來實現
1
2
3
4
5
|
def
add_end2(L
=
None
):
if
L
is
None
:
L
=
[]
L.append(
'END'
)
return
L
|