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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值