python坑:可變物件作為函式預設值
阿新 • • 發佈:2019-02-20
別說話,看程式碼:
>>> def aa(v, l=[]):
... l.append(v)
... print(id(l))
... return l
...
>>>
>>>
>>> aa("h")
4352204880
['h']
>>>
>>> aa("k")
4352204880
['h', 'k'] # 這不是我想要的結果
>>>
>>> aa("y")
4352204880
['h', 'k', 'y'] # 這不是我想要的結果
那麼為什麼會出現這樣的結果呢?因為程式碼在執行前需要先去編譯,然後會給這個方法靜態分配儲存空間,當然也會給引數分配儲存空間,也可以從列印引數“l”的儲存空間的id是不變的看的出來。所以,字典,集合,列表等等物件是不適合作為函式預設值的。
我瞬間回憶,以前寫過好多這樣的程式碼,但是好像都沒有出問題啊!!!有麼有這樣的同感~~~ 祈禱我大部分都是傳值了把,啊哈哈哈。
相同的例子:
>>> import time
>>> def ss(t=time.time()):
... print(id(t))
...
>>> def ss(t=time.time()):
... print(id(t))
... print(t)
...
>>> ss()
140544219076712
1500430646.18
>>>
>>> ss()
140544219076712
1500430646.18 # 時間引數並沒有變