※ 引述《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