23 ...: return
def_list
4...:
6 in [3]: my_list
7 out[3]: [1]
9 in [5]: my_other_list
10 out[5]: [1, 2] #
看到了吧,其實我們本來只想生成[2] 但是卻把第一次執行的效果頁帶了進來
11 in [6]: import
time
12 in [7]: def report_arg(my_default=time.time()):
13 ...: print
(my_default)
14...:
15 in [8]: report_arg() #
第一次執行
16 1399562371.32
17 in [9]: time.sleep(2) #
隔了2秒
18 in [10]: report_arg()
19 1399562371.32 #
時間竟然沒有變
這個例子說明了什麼? 字典,集合,列表等等可變物件是不適合作為函式預設值的. 因為這個預設值在函式建立的時候就生成了, 每次呼叫都是用了這個物件的」快取」.
也就是說,在第二個例子中 my_default 的值在第一次執行時就由 time.time() 確定好了,如果不給予傳參,my_default 的值將總是第一次執行預設好的值。
總結:1.列表是可變物件,不適合作為函式預設值。
2.預設值與函式一同生成。生成後預設值不會改變。
可以這樣改:
12if to is
none:
3 to =45
return to
不要使用可變物件作為鍵
作為鍵的物件,你要保證它每次呼叫hashcode都返回相同值。這也是為什麼stringbuilder沒有像string那樣用char陣列重寫hashcode方法,而是直接用的繼承自object的hashcode。如果使用可變屬性來寫equals和hashcode方法,會導致使用map,set時一些不...
python不要使用可變物件作為引數的預設值
幽靈乘客例子 如上 如果為空時,bus2和bus3引用的是相同的乙個list,就會造成粗錯誤 實際工作中,如果不想改變某個引數值,那麼通過以上這種賦值也會改變 解決方式self.passenger list passenger 相當於把list passenger passenger 舉個例子 a和...
盡量不要使用可變引數
在某些情況下我們希望函式引數的個數可以根據實際需要來確定,所以c語言中就提供了一種長度不確定的引數,形如 c 語言也繼承了這一語言特性。在採用ansi標準形式時,引數個數可變的函式的原型是 typefuncname typepara1,typepara2,這種形式至少需要乙個普通的形式引數,後面的省...