函數的參數一節中提到:
def add_end(L = []);
L.append('END')
return L
正常調用add_end時(也就是有參數傳入時):
>>> add_end([1, 2, 3])
[1, 2, 3, 'END']
>>> add_end(['x', 'y', 'z'])
['x', 'y', 'z', 'END']
當使用默認參數時:
>>> add_end() ['END']
>>> add_end()
['END', 'END']
>>> add_end()
['END', 'END', 'END']
廖雪峰解釋如下:
Python函數在定義的時候,默認參數L
的值就被計算出來了,即[]
,因為默認參數L
也是一個變量,它指向對象[]
,每次調用該函數,如果改變了L
的內容,則下次調用時,默認參數的內容就變了,不再是函數定義時的[]
了。
我的理解如下:
第一行,傳入參數[1,2,3],接下來的代碼都是針對[1,2,3] 的,跟L = [] 沒有關系,第三行和第一行一樣,這兩次都沒涉及到L = [] ,所以L的值不變。第二行沒有傳入參數,所以接下來的代碼是針對L了,由[]變成了['END'],第四行還是針對L,但L的值已經變成了['END'],又運行一次,所以就變成了['END','END'] 。
改進的方式如下:
def add_end(L=None): if L is None: L = [] L.append('END') return L
>>> add_end() ['END'] >>> add_end() ['END']
但是我對if L is None : L = [] 這一句還不理解,希望後續能明白吧。
http://xxxxxx/Linuxjc/1175089.html TechArticle