Re: [問題] function 的預設值

作者: Seudo (進擊的三笠)   2014-12-17 23:19:32
※ 引述《ql4au04 (泡麵)》之銘言:
: 今天在練習function時,發現在不同情況下,
: function的預設值會不同
(略
: 後來看memory address的差異時發現,
: v1在 x = 100 後, x的memory address和spam回傳的address不同
: v2在 x.append('hello')後,x的memory address和spam_2回傳的address相同
: 我的理解是 python的每個值都是object
: 賦值是改變address
: 所以x=40,是把x只向另一個address
: 而.append是對現有的object做改變
: 所以x.append('hello'),是更改現在address內的值
: 想請問大家,這樣的解釋是否正確?還是有其他的解釋呢?
Python的變數名稱是container, 指向某一物件
而每個物件有其id, type, value
像int, string 等value 不能改變的型態為Immutable Object
反之為 Mutable Object, 如list
在編譯的時候, 對function的預設值(empty list)產生一個物件
之後每次call這個function 就會指向該物件
所以在
x = spam_2(1) 時, x 指向該物件(empty list)
而 x.append('hello') 使得 function預設值物件的value改為 ['hello']
避免這問題可以把function改寫成
def spam_2(a, b=None):
if b is None:
b = []
return b
作者: ql4au04 (泡麵)   2014-12-21 06:14:00
感謝您的解答!!

Links booklink

Contact Us: admin [ a t ] ucptt.com