Python中None的含义是什么?为何赋值None后代码仍正常执行?
嘿,我来帮你拆解清楚这个问题里的两个关键点,你就能明白为什么代码会这样运行啦!
1. 参数默认值只在「没传对应参数」时生效
你定义函数时给name、first_name、last_name设的默认值None,只有在调用函数没有传递该参数的时候才会被使用。但看你的调用代码:
unpacker(**{'last_name': 'Ee', 'first_name': 'Elgene'})
这里的**是Python的字典解包操作符,它会把字典里的键值对直接转换成函数的关键字参数。换句话说,这行代码完全等价于:
unpacker(first_name='Elgene', last_name='Ee')
这时候first_name和last_name拿到的是你传递的非空字符串,而不是默认的None!
同样,packer的调用:
packer(name='Elgene', num=42, spanish_inquisition=None)
你明确给name传了'Elgene',所以name用的是这个值,不是默认的None;剩下的num和spanish_inquisition被**kwargs收集成字典,所以打印kwargs会输出{'num': 42, 'spanish_inquisition': None}。
2. 布尔判断里的「真值」与「假值」
你疑惑为什么布尔判断没返回False,这是因为Python里的布尔判断规则:
- 只有假值会被判定为False,比如
None、空字符串''、数字0、空列表[]、空字典{}等。 - 非空字符串、非零数字、非空容器等都是真值,会被判定为True。
在unpacker里,first_name是'Elgene',last_name是'Ee',都是非空字符串,所以if first_name and last_name的结果是True,自然会执行print('Hi {} {}'.format(first_name, last_name))这行代码,而不是输出Hi no name!。
如果我们换一种调用方式,比如不传first_name或者传空字符串:
unpacker(last_name='Ee') # first_name用默认值None unpacker(first_name='', last_name='Ee') # first_name是空字符串
这时候if first_name and last_name就会返回False,执行else分支的输出。
内容的提问来源于stack exchange,提问作者Elgene

