列表是一種常常使用的數據類型。在函數的定義中,經常會使用列表做爲參數。vue
好比,要測試一個接口的數據,接口返回的數據格式以下:python
{
"code": "20000",
"data": ["孫悟空","李白","甄姬"],
"msg": "success",
"status": 0 }
要測試的內容是:返回的 data 數據是否跟需求符合。在測試以前,須要對數據進一步處理,好比要增長 「王昭君」 這個元素進去,須要寫一個函數:json
def add_element(data=["孫悟空","李白","甄姬"]):
data.append('王昭君')
return data
print(add_element())
print(add_element())
print(add_element())
在函數定義的時候常常會給參數設置默認值,在這個例子中,將 data 參數設置了默認值,函數定義之後,後面會被頻繁的調用,指望值應該是打印以下:markdown
["孫悟空","李白","甄姬","王昭君"]
["孫悟空","李白","甄姬","王昭君"]
["孫悟空","李白","甄姬","王昭君"]
實際結果爲:app
["孫悟空","李白","甄姬","王昭君"]
["孫悟空","李白","甄姬","王昭君","王昭君"]
["孫悟空","李白","甄姬","王昭君","王昭君","王昭君"]
當定義函數時,會保存函數中默認參數 data 的值,也就是 ["孫悟空","李白","甄姬"]
,在每次調用的時候若是傳遞了新的實參,則使用傳遞的參數;沒有傳遞,使用定義函數時保存的默認參數。函數
上面兩次調用中,都沒有傳遞新的實參,程序會調用定義函數時保存的默認參數,由於 append() , 在第一次調用之後,默認參數已經由 ["孫悟空","李白","甄姬"]
改變爲 ["孫悟空","李白","甄姬","王昭君"]
,再次執行 append() 以後,就變成了 ["孫悟空","李白","甄姬","王昭君","王昭君"]
;同理,第三次又改變了。測試
可使用 id() 函數來定位問題:ui
def add_element(data=["孫悟空","李白","甄姬"]):
# id 來表示是否是同一個對象
print(id(data))
data.append('王昭君')
return data
print(add_element())
print(add_element())
print(add_element())
打印出來的 id(data)
爲同一個對象,也就是默認參數。若是咱們改變 第二個 print(add_element())
爲 print(add_element(["孫悟空","李白","甄姬"]))
,那麼第 2 個 id(data)
就會發生變化,由於它不在是默認值,而是新傳進來的實參,實際結果也將變成:url
2543416926792
['孫悟空', '李白', '甄姬', '王昭君']
2543418907848
["孫悟空","李白","甄姬", '王昭君']
2543416926792
['孫悟空', '李白', '甄姬', '王昭君', '王昭君']
def add_element(data=["孫悟空","李白","甄姬"]):
if data == ["孫悟空","李白","甄姬"]:
data = ["孫悟空","李白","甄姬"]
data.append('王昭君')
return data