形参的[],与实参的[] 的不同
形参缺省值里的空列表,是同一id:
def foo(y=[]):
y.append(1) #y 是局部变量 #y不提供实参,就使用保存在函数对象了的缺省值
return y
foo(),foo(),foo()
([1, 1, 1], [1, 1, 1], [1, 1, 1])
缺省值被保存在foo.__defaults__中,是一个元组
foo.__defaults__
([1, 1, 1],)
def foo2(x="abc", y =123, z = [1,2]):
x += '~'
y += 100
z.append(100)
return x, y, z
foo2(),foo2()
(('abc~', 223, [1, 2, 100, 100]), ('abc~', 223, [1, 2, 100, 100]))
foo2.__defaults__
('abc', 123, [1, 2, 100, 100])
关键字缺省值用 __kwdefaults__查看,是一个字典
def foo3(x = 1, *args, m =10, n , **kwargs):
pass
foo3.__defaults__
(1,)
foo3.__kwdefaults__
{'m': 10}
foo3(n=200,z=900)
foo3.__kwdefaults__
{'m': 10}
实参里的空列表,是不同id
def foo(y=[]):
y.append(1) #y 是局部变量
return y
foo([]),foo([]),foo([])
([1], [1], [1])
可变类型的+= id不变
x = []
print(1,id(x),x)
x +=[1] # x.extend([1])
x +=[1]
print(2,id(x),x)
1 2005862758792 []
2 2005862758792 [1, 1]
x = []
print(1,id(x),x)
x = x +[1] #生成一个全新的列表覆盖
x = x + [1]
print(2,id(x),x)
1 2005862452616 []
2 2005862734664 [1, 1]
不可变类型的+= id改变
a = list(range(2))
print(id(a),a)
a += [10] # 可变类型,+= id不变
print(id(a),a)
a = a +[20] # 可变类型 ,x=x+~ id改变
print(id(a),a)
2005861883400 [0, 1]
2005861883400 [0, 1, 10]
2005861941704 [0, 1, 10, 20]
a = tuple(range(2))
print(id(a),a)
a += (10,) # 不可变类型,+= id改变
print(id(a),a)
a = a +(20,) # 不可变类型 ,x=x+~ id改变
print(id(a),a)
2005862487496 (0, 1)
2005862686296 (0, 1, 10)
2005863576504 (0, 1, 10, 20)
type((10))
int
x+=1
x+=1 就地修改;相当于extend
def foo4(x=[]):
x += [1]
print(x)
print(1,foo4())
print(2,foo4())
print(3,foo4())
print(4,foo4())
print(5,foo4())
[1]
1 None
[1, 1]
2 None
[1, 1, 1]
3 None
[1, 1, 1, 1]
4 None
[1, 1, 1, 1, 1]
5 None
x = x +1
生成一个全新对象覆盖x
def foo4(x=[]):
x = x + [1]
print(x)
print(1,foo4())
print(2,foo4())
print(3,foo4())
print(4,foo4())
print(5,foo4())
[1]
1 None
[1]
2 None
[1]
3 None
[1]
4 None
[1]
5 None