Python 默认值参数


一、问题

定义有默认参数的函数。



二、解决方案

直接在函数定义中给参数指定默认值。

def test(a, b=2):
	print(a, b)
test(1)
test(1, 3)

输出:

1 2
1 3


默认参数是可修改的容器,如:列表、字典、集合,可以用 None 作为默认值。

def test(a, b=None):
    if b is None:
        return None
    else:
        return []

print(test(1, None))
print(test(1, []))

输出:

None
[]


最好不要用if not b:代替if b is None:

因为在if not b:中,当b是长度为0的字符串、列表、元组、字典时,也会返回 None。所以会将输入为0、[], (), {} 当成没有输入。

def test(a, b=None):
    if not b:
        return None
    else:
        return []
print(test(1, None))
print(test(1, []))

输出:

None
None


并不想提供一个默认值,仅测试默认参数是不是传进来。

测试参数是否被传递进来,不能 None、0、False值,因为这些值都是合法的,需要创建一个独一无二的私有对象实例。如:object 类的实例 object()

_no_value = object()
def test(a, b=_no_value):
    if b is _no_value:
        print('b值没有传进来。')
    else:
        print(b)

test(1)
test(1, None)

输出:

b值没有传进来。
None

传递一个 None 值和不传值两种情况不同。



三、讨论

默认参数的值仅在函数定义的时候赋值一次。

x = 2
def test(a, b=x):
    print(a, b)
test(1)

x = 3
test(1)

输出:

1 2
1 2

改变 x 的值对默认参数值没影响,因为在函数定义的时候已经确定了它的默认值。



默认参数的值是不可改变的对象。

def test(a, b=[]):
    return b

t = test(1)
print(t)

t.append(2)
t.append('wangke')
print(t)

输出:

[]

[2, 'wangke']

上面示例,b 的默认值是可改变对象,对 b 进行修改,下次调用这个函数默认值会改变。

为避免这种情况,将默认值设为 None。



posted @   做梦当财神  阅读(1684)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2017-12-08 MongoDB(课时29 MapReduce)
点击右上角即可分享
微信分享提示