我看过几个这样的代码示例:
if not someobj:
#do something
但我想知道为什么不这样做:
if someobj == None:
#do something
有什么区别吗?一个人比另一个人有优势吗?
在第一个测试中,Python尝试将对象转换为bool
值(如果尚未转换为值)。粗略地, 我们在问对象:您有意义吗? 这可以通过以下算法完成:
如果对象具有__nonzero__
特殊方法(如数字内置int
和float
),则它将调用此方法。它必须要么返回bool
其随后直接使用值,或者int
被认为是值False
如果等于零。
否则,如果对象有一个__len__
特殊的方法(如做容器内置插件,list
,dict
,set
,tuple
,…),它会调用这个方法,考虑一个容器False
,如果它是空的(长度为零)。
否则,该对象被认为是True
,除非它是None
在这种情况下,它被认为是False
。
在第二个测试中,将对象与进行相等性比较None
。在这里, 我们问对象:“您等于这个其他值吗?” 这可以通过以下算法完成:
如果对象具有__eq__
方法,则将其调用,然后将返回值转换为一个bool
值,并用于确定的结果if
。
否则,如果对象具有__cmp__
方法,则将其调用。此函数必须返回一个int
指示两个对象的顺序的指示符(-1
if self < other
,0
if self == other
,+1
if self > other
)。
否则,比较对象的身份(即,它们引用了同一对象,可以由is
操作员进行测试)。
使用is
运算符可以进行另一项测试。 我们会问对象“您是这个特定对象吗?”
通常,我建议对非数字值使用第一个测试,如果要比较具有相同性质(两个字符串,两个数字,…)的对象,并且仅在以下情况下检查身份,请使用该测试是否相等使用哨兵值(例如,None
未针对成员字段初始化,或使用getattr
或__getitem__
方法时未初始化)。
总而言之,我们有:
>>> class A(object):
... def __repr__(self):
... return 'A()'
... def __nonzero__(self):
... return False
>>> class B(object):
... def __repr__(self):
... return 'B()'
... def __len__(self):
... return 0
>>> class C(object):
... def __repr__(self):
... return 'C()'
... def __cmp__(self, other):
... return 0
>>> class D(object):
... def __repr__(self):
... return 'D()'
... def __eq__(self, other):
... return True
>>> for obj in ['', (), [], {}, 0, 0., A(), B(), C(), D(), None]:
... print '%4s: bool(obj) -> %5s, obj == None -> %5s, obj is None -> %5s' % \
... (repr(obj), bool(obj), obj == None, obj is None)
'': bool(obj) -> False, obj == None -> False, obj is None -> False
(): bool(obj) -> False, obj == None -> False, obj is None -> False
[]: bool(obj) -> False, obj == None -> False, obj is None -> False
{}: bool(obj) -> False, obj == None -> False, obj is None -> False
0: bool(obj) -> False, obj == None -> False, obj is None -> False
0.0: bool(obj) -> False, obj == None -> False, obj is None -> False
A(): bool(obj) -> False, obj == None -> False, obj is None -> False
B(): bool(obj) -> False, obj == None -> False, obj is None -> False
C(): bool(obj) -> True, obj == None -> True, obj is None -> False
D(): bool(obj) -> True, obj == None -> True, obj is None -> False
None: bool(obj) -> False, obj == None -> True, obj is None -> True
问题内容: 我在服务器上有一个网站。主页为example.com/index.php。 好的,我将一个index.html命名文件上传到服务器(根目录),当我在浏览器的URL栏中键入站点的域时,感到很惊讶,因为index.html页面已加载。 (example.com-> example.com/index.html)所以不是我想要的。 我的问题:为什么会这样?为什么index.html比inde
我一直在用OpenMP调用这个 在C11 std::threads中(我相信这些只是pthreads) 但是,OpenMP的实现速度是原来的两倍——更快!我本以为C11线程会更快,因为它们更低级。注意:上面的代码在一个循环中不仅被调用了一次,而且可能被调用了10000次,所以这可能与此有关吗? 编辑:为了澄清,在实践中,我要么使用OpenMP,要么使用C 11版本——不是两者都使用。当我使用Ope
问题内容: 为什么在Python中等于?它不应该像那样抛出异常吗? 问题答案: Wikipedia对历史进行了有趣的报道,并对以下内容的价值有不同的看法: 至少从19世纪初期开始,辩论一直在进行。当时,大多数数学家都同意,直到1821年,柯西(Cauchy)以及诸如未定义形式的表格之类的表达式才被列出。在1830年代,利比里(Libri)发表了令人信服的论点,莫比乌斯(Möbius)站在他身边。
问题内容: 在Python中(我仅使用Python 3.6进行过检查,但我相信它也适用于许多以前的版本): 但: 为什么两种方法的结果不同?相等运算符对元组的处理方式是否不同? 问题答案: 前两个表达式都解析为元组: (即),然后是 ,其次是(仍然如此)。 由于逗号分隔符相对于相等运算符具有较高的优先级,因此将表达式进行拆分:Python看到一个元组包含两个表达式,其中一个恰好是一个相等测试,而不
问题内容: 我最近才发现我认为这里有些奇怪。为什么会这样,并且处于不同的优先级?我会以为他们处于同一水平。以上证明了这一点。即使从左到右的求值对第一个给出的都是假,而第二个则给出的是真,这两个陈述都是正确的。 有人知道这背后的原因吗? (顺便说一句,我只是在这里使用了很多括号,但是是旧代码提出了这个问题) 问题答案: 因为在传统的数学表示法中,(逻辑合取)的优先级高于(逻辑合取)。 出于显而易见的
所以我的问题是为什么not Queue比list更受欢迎。我相信一定有某种原因,但不知何故,我错过了这种理解? 更新:-这是我明确的要求 1)加法发生在末尾,应该很快。可能是O(1) 3)由于查找将基于om索引进行,因此两者都将是O(1)
问题内容: 我从python学到的内容无: 当我放入列表并用数字和字符串排序时。我得到以下结果,这意味着它是最小的数字? 逆转: 正常排序: python sorted function如何与None一起工作? 问题答案: 比较不同类型时,CPython 2应用了一些不同的规则: 首先排序。 数字先于其他类型,并且在数字之间进行比较。 其他类型按其类型 名称 排序,除非它们显式实现比较方法。 此外
问题内容: 我最近参加了一次采访,他们问我一个问题:“为什么接口比抽象类更受青睐?” 我尝试给出一些答案,例如: 我们只能获得一种扩展功能 他们是100%抽象 实现不是硬编码的 他们要求我使用您使用的任何JDBC API。“它们为什么是接口?”。 我可以为此得到更好的答案吗? 问题答案: 该面试问题反映出提出该问题的人的某种信念。我相信这个人是错的,因此您可以选择两个方向之一。 给他们他们想要的答