这个就是python里面的坑了 函数的默认参数是一个list 当第一次执行的时候实例化了一个list 第二次执行还是用第一次执行的时候实例化的地址存储 所以三次执行的结果就是 [1, 1, 1] 想每次执行只输出[1] ,默认参数应该设置为None
创新互联建站专注于企业成都营销网站建设、网站重做改版、盐津网站定制设计、自适应品牌网站建设、H5页面制作、商城网站建设、集团公司官网建设、成都外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为盐津等各大城市提供网站开发制作服务。
1.在定义有默认参数的函数时,需要注意以下: 必传参数必须在前面,默认参数在后;
备注:python为了简化函数的调用,提供了默认参数机制,这样在调用函数时,就可以省略最后一个参数不写;设置何种参数为默认参数?一般来说,将参数值变化小的设置为默认参数。
2. 若参数为列表,且有默认值
2.1若调用方法时传该参数,则没有问题
2.2 若调用方法时不传该参数,则有问题 ,问题是:每次调用该方法时,该参数不是创建方法时的默认值,而是多次调用被修改后的列表。
4.7.1. 默认参数值
最常用的一种形式是为一个或多个参数指定默认值。这会创建一个可以使用比定义是允许的参数更少的参数调用的函数,例如:
def ask_ok(prompt, retries=4, complaint='Yes or no, please!'):
while True:
ok = input(prompt)
if ok in ('y', 'ye', 'yes'):
return True
if ok in ('n', 'no', 'nop', 'nope'):
return False
retries = retries - 1
if retries 0:
raise OSError('uncooperative user')
print(complaint)
这个函数可以通过几种不同的方式调用:
只给出必要的参数:
ask_ok('Do you really want to quit?')
给出一个可选的参数:
ask_ok('OK to overwrite the file?', 2)
或者给出所有的参数:
ask_ok('OK to overwrite the file?', 2, 'Come on, only yes or no!')
这个例子还介绍了 in 关键字。它测定序列中是否包含某个确定的值。
默认值在函数 定义 作用域被解析,如下所示:
i = 5
def f(arg=i):
print(arg)
i = 6
f()
将会输出 5。
重要警告: 默认值只被赋值一次。这使得当默认值是可变对象时会有所不同,比如列表、字典或者大多数类的实例。例如,下面的函数在后续调用过程中会累积(前面)传给它的参数:
def f(a, L=[]):
L.append(a)
return L
print(f(1))
print(f(2))
print(f(3))
这将输出:
[1]
[1, 2]
[1, 2, 3]
如果你不想让默认值在后续调用中累积,你可以像下面一样定义函数:
def f(a, L=None):
if L is None:
L = []
L.append(a)
return L
默认参数的问题,看下面这个例子:
def f(l=[]):
l.append(1)
print(l)
f()
f()
f()
输出
[1]
[1, 1]
[1, 1, 1]
所以python的默认参数最好设置为None,这样就会避免这种情况,如上一直调用的话l会变的越来越大。