为了账号安全,请及时绑定邮箱和手机立即绑定

python函数问题

python函数问题

wolvvi 2017-01-15 14:35:22
def append(args=[]):    args.append(0)    print(args)append()append([1])append()会输出[0][1,0][0,0]想问下为什么第三个会是[0,0]呢,再次调用args的时候还是第一次调用的args为啥呢
查看完整描述

2 回答

已采纳
?
Iamxiaoq

TA贡献33条经验 获得超6个赞

在python里面,一切切对象,函数也是对象,函数这个对象有个特殊的__defaults__属性存储着其在定义的时候声明的默认参数

//img1.sycdn.imooc.com//587b7d800001ab6002990409.jpg

这个__defaults__随着函数的定义而生成,第27

如果调用时没有传递参数,则使用存储在__defaults__中的值,第28

由于第28调用了__defaults__中的list.append(0),调用完成后__defaults__中的list的值为[0],第29

第30append([1]),此次调用传递了值,则不使用默认参数,可以看到两个id不一样

第30调用完成后也不影响__defaults__中的list,第31

第32的调用也没有传递参数,则使用__defaults__中保存的list,经过第28后,默认参数list的值为:[0],此时再执行[0].append(0),得到的自然是[0,0], 输出的id与28输出的id一致,证明他们是同一个list。。。。


所以,默认参数一般不要使用可变对象

def append(args=None):
    if args is None:
        args = []
    args.append(0)
    print(args)


查看完整回答
反对 回复 2017-01-15
  • wolvvi
    wolvvi
    那就您最后给出的这段代码来说,如果调用这段代码: append() append([1]) append() 会输出[0],[1,0],[0] 第三个调用没有传递参数,那么使用的应该是之前默认参数值为[0]的list吧,这样传进去的args不是none啊,那么if 语句为啥执行呢,得出的结果不还是应该为[0,0]吗,为什么只有一个0呢列表中
  • Iamxiaoq
    Iamxiaoq
    def append(args=None): if args is None: args = [] # 这里只是对args这个局部变量进行赋值,并没有改变__defaults__中的值,__defaults__中的值仍然为None args.append(0) print(args)
  • Iamxiaoq
    Iamxiaoq
    if args is None: args = [] # 这里只是对args这个局部变量进行赋值,并没有改变__defaults__中的值,__defaults__中的值仍然为None
?
孤独的小猪

TA贡献232条经验 获得超302个赞

 [1]相当于是传一个新的列表进去,并没有用到函数中的 []  , 所以x.append(0) 在这次中,是追加到 [1] 里面,并不是函数默认的[]里面,你要用这种的话,就不能传一个列表进去.

def appendx(n, x=[]):
    x.append(n)




查看完整回答
反对 回复 2017-01-16
  • 2 回答
  • 0 关注
  • 1811 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信