“x 不在 y 中”或“x 不在 y 中”
- 2025-03-04 08:24:00
- admin 原创
- 84
问题描述:
在测试成员资格时,我们可以使用:
x not in y
或者:
not x in y
根据x
和,此表达式可能有许多可能的上下文y
。例如,它可以用于子字符串检查、列表成员资格、字典键存在性。
这两种形式总是等价的吗?
是否有首选语法?
解决方案 1:
它们总是给出相同的结果。
事实上,not 'ham' in 'spam and eggs'
似乎是执行单个“not in”操作的特殊情况,而不是执行“in”操作然后否定结果:
>>> import dis
>>> def notin():
'ham' not in 'spam and eggs'
>>> dis.dis(notin)
2 0 LOAD_CONST 1 ('ham')
3 LOAD_CONST 2 ('spam and eggs')
6 COMPARE_OP 7 (not in)
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
>>> def not_in():
not 'ham' in 'spam and eggs'
>>> dis.dis(not_in)
2 0 LOAD_CONST 1 ('ham')
3 LOAD_CONST 2 ('spam and eggs')
6 COMPARE_OP 7 (not in)
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
>>> def not__in():
not ('ham' in 'spam and eggs')
>>> dis.dis(not__in)
2 0 LOAD_CONST 1 ('ham')
3 LOAD_CONST 2 ('spam and eggs')
6 COMPARE_OP 7 (not in)
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
>>> def noteq():
not 'ham' == 'spam and eggs'
>>> dis.dis(noteq)
2 0 LOAD_CONST 1 ('ham')
3 LOAD_CONST 2 ('spam and eggs')
6 COMPARE_OP 2 (==)
9 UNARY_NOT
10 POP_TOP
11 LOAD_CONST 0 (None)
14 RETURN_VALUE
我起初以为它们总是给出相同的结果,但它not
本身只是一个低优先级的逻辑否定运算符,可以a in b
像任何其他布尔表达式一样轻松地应用,而not in
为了方便和清晰起见,它是一个单独的运算符。
上面的反汇编很有启发!看起来,虽然not
显然是逻辑否定运算符,但形式not a in b
是特殊的,因此它实际上并没有使用通用运算符。这使得not a in b
表达式与完全相同a not in b
,而不仅仅是一个产生相同值的表达式。
解决方案 2:
不,没有区别。
运算符
not in
被定义为具有 的逆真值in
。— Python 文档
我认为
not in
这是首选,因为它更明显,并且他们为它添加了一个特殊情况。
解决方案 3:
它们的含义相同,但是pycodestyle Python 风格指南检查器(以前称为 pep8)更喜欢规则 E713not in
中的运算符:
E713:会员资格测试应该是
not in
另请参阅“Pythonif x is not None
还是if not x is None
?”以了解非常相似的风格选择。
解决方案 4:
其他人已经明确表示,这两个说法在相当低的层面上是等同的。
然而,我认为还没有人足够强调,既然这把选择权留给了你,你就应该
选择使您的代码尽可能易读的形式。
而且不一定对任何人都尽可能地易读,即使这当然是一个好的目标。不,确保代码对你来说尽可能地易读,因为你是最有可能稍后返回并尝试阅读此代码的人。
解决方案 5:
在 Python 中,没有区别。而且也没有偏好。
解决方案 6:
从句法上看,它们是相同的语句。我会很快说,前者'ham' not in 'spam and eggs'
表达了更清晰的意图,但我见过一些代码和场景,其中not 'ham' in 'spam and eggs'
前者表达了比后者更清晰的含义。
扫码咨询,免费领取项目管理大礼包!