Python函數的形參中的缺省值中的可變類型: x 1 和x =1 是不同的 (1)

形參的[],與實參的[] 的不同

形參缺省值裏的空列表,是同一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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章