[英]What is the difference between None check and var or default syntax in Python?
我注意到此语法列为“ gotchya”,但没有解释原因:
def func(x=None):
#good
if x == None:
x = []
#bad
x = x or []
用什么方式可以成为陷阱?
在这种特殊情况下,这很不好,因为空列表的评估结果为false。 如果您对列表进行变异,那么结果将不会达到预期
def func(x=None):
x = x or []
x.append('hello')
mylist = []
func(mylist)
print mylist[0] # doesn't work
由于您要检查呼叫者是否通过了None
,因此您应该明确地说出来,而不要变得聪明。 像[]
, ()
, {}
, 0
和False
求值结果都是false,任何用户定义的对象(想要检查虚假性)确实可以捕获太多的误报。
(另外:使用is None
代替== None
可以更快,更可靠 。)
如果bool(x)
为false,则x or []
将返回一个空列表。 None
为假,但零(int,long,float等)和空集合( []
, {}
, ""
等)也为假。 因此,这不是捕获None
,而是捕获虚假对象-这不等于x == None
并且很可能不是您想要的(空集合对于许多算法而言都是完全有效的输入)。
哦,虽然我们在它:这应该是x is None
- is
是检验标识语义正确的(和propably更快)的选择。 ==
可以被x覆盖,并且您不能确定它是否会认为None
不等于其自身,甚至不会破坏它。
我认为检查任何Python单例的最佳习惯是:
if x is None:
x = []
原因是某些对象(例如django或sqlalchemy中的ORM对象)是惰性的(它们直到最近的可能时间才会调用数据库)。 使用其他选项检查“无”可能会触发对昂贵操作的评估。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.