7.1.默认值参数基本使用
定义函数的时候, 如果个别参数不需要调用者必须传递实参过来, 则可以使用参数默认值.
当调用函数的时候, 带有默认值的参数可以不传递实参过来, 这样 pytyon 就会使用这个参数的默认值.
如果带有默认值的参数也被传递了实参过来, 则使用调用者传递过来的具体的值, 不再使用默认值.
def add(x, y=20): # 给 y 添加了默认值
return x + y
print(add(100, 200)) # 给 y 传递了实参, 则不会使用默认值
print(add(100)) # 没有给 y 传递实参, 则使用 y 的默认值
使用参数默认值的好处: 使用较少的参数去调用函数
7.2.默认值赋值时机
参数的默认值, 可以是字面量, 也可以用 函数 赋值.
那么参数的默认值是在什么时候赋值的?
python 的默认值是在函数定义的时候已经赋值完成了! 你可以理解为这是静态赋值!
这个和其他语言有点不用:比如 javascript 是在每次调用的时候才赋值.
i = 10
def add(x, y=i): # 函数定义的时候 y 的值已经被赋值为10
return x + y
i = 20 # 这里更改 i 的值不会更改参数 y 的默认值
print(add(10)) # 20
参数的默认值也可以是函数
i = 10
def get_value():
global i
i += 10
return i
def add(x, y=get_value()): # y=20
return x + y
i = 20
print(add(10)) # 30
print(add(10)) # 30
7.3.带有默认值参数后的参数处理
python 规定, 带有默认的参数的后面的所有参数都是可选的
意思就是说,这些参数也应该加上默认值, 否则语法错误!
下面这种定义方式是错误的
def add(x, y = 10, z): # 错误. z 必须也有默认值
pass
后面的参数不能以前面的参数作为默认值
python 不允许后面的参数把前面的参数作为默认值. (javascript 允许)
def add(x, y = 10, z = y):
pass
7.4.默认值是可变对象时的共享问题
由于默认值是在函数定义的时候就赋值成功了.
对可变参数来说, 多次调用这个函数, 那么每次调用都是共享的同一个对象.
如果函数执行的时候修改了共享对象, 则会反应到其他调用的地方.
def foo(a, nums=[]):
nums.append(a)
return nums
print(foo(10))
print(foo(20))
print(foo(30))
你会发现返回的list
中, 总是保存着前面添加的值.
因为多次调用他们用的是同一个list
对象
可以通过下面的代码解决这样的问题
def foo(a, nums=None):
if nums is None:
nums = []
nums.append(a)
return nums
print(foo(10))
print(foo(20))
print(foo(30))