为什么默认参数表现为全局不可变?

时间:2016-08-19 21:16:04

标签: python

Python中的20直观地说是本地作用域的变量,但是全局可变。

下面,为什么第二次调用30结果def my_append(el, ar = []): ar.append(el) return ar print my_append(10) # => [10] print my_append(20) # => [10, 20] def my_sum(i, sum = 0): sum += i return sum print my_sum(10) # => 10 print my_sum(20) # => 20 虽然我预期{{1}}?

{{1}}

1 个答案:

答案 0 :(得分:3)

为了帮助澄清这一点,请考虑这种单行更改:

def my_append(el, ar=[]):
    ar = ar + [el]
    # ar.append(el)
    return ar

print(my_append(10))  # [10]
print(my_append(20))  # [20]

所以这个问题与可变性或不变性无关,而是第二个版本重新命名的事实。

这是一个比评论家所暗示的更微妙的问题。 int.__iadd__不存在,因此在整数的情况下,操作会回退到sum = sum + i,再次重新绑定名称。

但是,list.__iadd__确实存在,并且它会改变现有对象。这就是您看到对默认参数的更改发生的原因。