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}}
答案 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__
确实存在,并且它会改变现有对象。这就是您看到对默认参数的更改发生的原因。