[問題] 類別屬性參考到相同物件

作者: cryinrain (啞貓)   2018-09-04 20:17:41
看書時遇到一個問題沒辦法解釋,想請教各位先進
class Kangaroo:
def __init__(self, name, contents=[]):
self.name = name
self.pouch_contents = contents
為什麼這個類別在建立不同物件時,contents會參考到相同的串列?
我以為在每次建立物件時,各自物件的contents都會參考到一個新的串列
但事實上並不是,而書上提供的解法是:
class Kangaroo:
def __init__(self, name, contents=None):
self.name = name
if contents is None:
contents = []
self.pouch_contents = contents
為什麼這邊的contents = []就可以建立新的串列物件?
作者: TuCH (謬客)   2018-09-04 20:22:00
寫在函式外的[] 是全域的[] 寫在fun裡的是區域的[]
作者: cryinrain (啞貓)   2018-09-04 20:45:00
原來如此,非常感謝!!
作者: s860134 (s860134)   2018-09-05 12:23:00
引數列的預設引數在 class 被讀取時就建立了
作者: Yshuan (倚絃)   2018-09-06 09:10:00
Mutable arguments, 行為類似c++的static local
作者: ckc1ark (偽物)   2018-09-06 15:45:00
default值藏在 Kangaroo.__init__.__defaults__所以沒傳contents就會從這拿 就會是同一個

Links booklink

Contact Us: admin [ a t ] ucptt.com