繁体   English   中英

None check和var或Python中的默认语法之间有什么区别?

[英]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 ,因此您应该明确地说出来,而不要变得聪明。 [](){}0False求值结果都是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM