首页 > 其他 > 详细

4、参数传递注意事项

时间:2021-04-29 22:39:07      阅读:24      评论:0      收藏:0      [点我收藏+]
def func(a,b=[]):
  b.append(a)
  print(b)

func(1)
func(2,[11,22,33])
func(3)

#执行结果: [1] [11,22,33,2] [1,3]   #此时每个func函数是立即打印所以会出现不同结果
def func(a,b=[]):
    b.append(a)
    return b

l1 = func(1)
l2 = func(2,[11,22])
l3 = func(3)

print(l1,l2,l3)                   #执行结果: [1,3]   [11,22,2]   [1,3]

函数的第二个默认参数是一个list,当第一次执行的时候实例化了一个list,第三次执行还是用第一次执行的时候实例化的地址存储,
所以第一和第三次执行的结果就是相同的,想每次执行只输出当前传入参数 ,默认参数应该设置为None。
def add_end(L=[]):
    L.append(‘END‘)
    return L
当你正常调用时,结果似乎不错:

>>> add_end([1, 2, 3])
[1, 2, 3, ‘END‘]
>>> add_end([‘x‘, ‘y‘, ‘z‘])
[‘x‘, ‘y‘, ‘z‘, ‘END‘]
当你使用默认参数调用时,一开始结果也是对的:

>>> add_end()
[‘END‘]
但是,再次调用add_end()时,结果就不对了:

>>> add_end()
[‘END‘, ‘END‘]
>>> add_end()
[‘END‘, ‘END‘, ‘END‘]
很多人很疑惑,默认参数是[],但是函数似乎每次都“记住了”上次添加了‘END‘后的list。
原因解释如下:
Python函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认参数L也是一个变量,它指向对象[],每次调用该函数,如果改变了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了。
 定义默认参数要牢记一点:默认参数必须指向不变对象!
 
要修改上面的例子,我们可以用None这个不变对象来实现:

def add_end(L=None):
    if L is None:
        L = []
    L.append(‘END‘)
    return L
现在,无论调用多少次,都不会有问题:

>>> add_end()
[‘END‘]
>>> add_end()
[‘END‘]

4、参数传递注意事项

原文:https://www.cnblogs.com/kuangfengnulang/p/14719362.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!