形參的[],與實參的[] 的不同
形參缺省值裏的空列表,是同一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