gpt4 book ai didi

python - 与空列表比较时使用 "=="运算符是否错误?

转载 作者:IT老高 更新时间:2023-10-28 22:22:33 26 4
gpt4 key购买 nike

当我使用 == 运算符与空列表进行比较时,

PyCharm (4.0.6) 会报错,但当我使用 is 运算符时不会报错:

enter image description here

我猜这与 PEP 8 有关,但问题是当我使用 is 运算符时,正如 PyCharm 所建议的那样,我有一个误报。这是 iPython shell 中的一个简单示例,表明在这种情况下 == 运算符似乎更合适,因为 is 运算符返回假阴性:

In[2]: actions = []
In[3]: actions == []
Out[3]: True
In[4]: actions is []
Out[4]: False

有人能解释一下为什么 PyCharm 在与空列表进行比较时提示 == 运算符吗?根据 PEP 8,我做错了吗?

最佳答案

引用 PEP-8's Programming Recommendations部分,

For sequences, (strings, lists, tuples), use the fact that empty sequences are false.

Yes: if not seq:
if seq:

No: if len(seq)
if not len(seq)

由于空序列在 Python 中是 Falsy,

>>> bool([])
False
>>> bool(())
False

您可以简单地使用 PEP-8 中提到的 if not

注意:你不应该使用 is 来比较两个值是否相等,因为 is 运算符会检查两个对象是否为一,并且相同,但 == 检查两个对象是否相等。


我深入研究了源代码以弄清楚发生了什么。当我们执行 a == [],

>>> dis(compile('if a == []: pass', "string", "exec"))
1 0 LOAD_NAME 0 (a)
3 BUILD_LIST 0
6 COMPARE_OP 2 (==)
9 POP_JUMP_IF_FALSE 15
12 JUMP_FORWARD 0 (to 15)
>> 15 LOAD_CONST 0 (None)
18 RETURN_VALUE

我们正在构建一个新列表,这将是一个非常昂贵的操作,仅用于比较。另一方面

>>> dis(compile('if not a: pass', "string", "exec"))
1 0 LOAD_NAME 0 (a)
3 POP_JUMP_IF_TRUE 9
6 JUMP_FORWARD 0 (to 9)
>> 9 LOAD_CONST 0 (None)
12 RETURN_VALUE

我们正在尝试查看当前序列是否可能是真实的。这在内部检查序列的长度是否为零(这只是一个简单的查找,因为列表的长度保存在一个变量中)。如果长度为零,则 if not actions: 将是 Truthy。这里我们没有构造一个新的列表,只是隐式地检查长度,而不是显式地做

if len(actions) == 0:

所以,我猜 Python 大师建议 if not seq 因为也可能有性能优势。

关于python - 与空列表比较时使用 "=="运算符是否错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30147428/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com