1 不要使用可變物件作為函式預設值

2022-05-23 01:51:09 字數 911 閱讀 2520

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.預設值與函式一同生成。生成後預設值不會改變。

可以這樣改:

1

2if 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,這種形式至少需要乙個普通的形式引數,後面的省...