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))

Copyright © 李振超 2018 all right reserved,powered by Gitbook
该文件最后修订时间: 2018-02-25 07:12:09

results matching ""

    No results matching ""