Re: [問題] default value for arguments..

看板Python作者 (sbr)時間15年前 (2009/01/28 14:27), 編輯推噓3(300)
留言3則, 3人參與, 最新討論串3/4 (看更多)
※ 引述《yungyuc (酷狗喵千代)》之銘言: : ※ 引述《dimen (一人吃二人補)》之銘言: : : hi, all: : : 我在國外的某個blog上看到一篇文章: : : http://tinyurl.com/8t73xp : : 裡面的一段程式碼: : : ... def __init__(self, name='', stuff=[]): : Python 在定義函式/方法的時候會進行評估 (evaluation) : stuff=[] 中的 [] 等同於 list(),會建立一個 list 的實體 : 然後這個 list 實體再指定給 stuff 變數 (在此為函式參數) : : ... self.name = name : : ... self.stuff = stuff : stuff 參數所指涉的 list 物件又被指定給 self.stuff : 但注意,都是同一個 list 實體 : : ... : : ... def add_stuff(self, gadget): : : ... self.stuff.append(gadget) : : ... : : ['tree'] : : ['tree'] : 如果再加一行 f.stuff == g.stuff,你會發現此表達式為真 : 為什麼?因為在 Foo 類別的 constructor (Foo.__init__) 中 : self.stuff 是被指定給「同一個 list 實體」 : 該 list 實體是在定義 Foo.__init__ 的時候就建出來的 這裡應該使用 is operator 才證明兩者是同一個物件。 f.stuff is g.stuff : : 這結果跟我之前學的OOP有些不同..沒實際執行一次,我會以為g.stuff應該是[] : 這和 OOP 完全無關,而是 Python 評估 function/method definition 的特性使然 這個例子可以強調 Python 只有 statement 沒有 declaration 的特性。 def __init__(self, name='', stuff=[]): self.name = name self.stuff = stuff 上述這個 def statement 執行完成後產生了一個 function object,bind 在 class namespace 中的 "__init__" 名稱;這個 function object construction 過程只有發生一次,所以 stuff=[] 這個 expression 也只 evaluate 一次,而 不是每次此 function 被執行時都 evaluate 一次。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.173.133.197

01/28 20:21, , 1F
我錯了,要用 is 而非 == :)
01/28 20:21, 1F

01/29 00:58, , 2F
感謝大家的回覆,我再來研究看看
01/29 00:58, 2F

01/29 02:55, , 3F
可以用id(g.stuff) and id(g.stuff)來看object的位置是否一樣
01/29 02:55, 3F
文章代碼(AID): #19V_g_TB (Python)
文章代碼(AID): #19V_g_TB (Python)