所以我的老板在对代码进行快速搜索和替换并打开一个Pull Request之后(偶然)想到了这个,其中tag总是一个字符串:
if "team_" in tag in tag:
令我惊讶的是,这真的起作用了!不是很确定为什么。我原以为会从左到右解析它,然后得到一个错误,就像这样
>>> ("team_" in "something") in "something"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'in <string>' requires string as left operand, not bool
或者甚至在最坏的情况下,从右到左解析它(我觉得这很奇怪,但让我们假设它是这样工作的)
>>> "team_" in ("something" in "something")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: argument of type 'bool' is not iterable
但我得到的却是
>>> "team_" in "something" in "something"
False
>>>
>>> "some" in "something" in "something"
True
>>>
有人能给我解释一下那是怎么/为什么起作用的吗?
2条答案
按热度按时间2izufjch1#
它工作的原因和
Python允许将比较运算符链接起来,因此这等效于
按照同样的逻辑
相当于
当
tag
是一个字符串时,它实际上只等价于"team_" in tag
,因为字符串总是在它自己里面;但如果tag
是一个列表或其他容器,它通常为false,因为容器通常不包含它自己的示例(可以进行递归引用,例如mylist.append(mylist)
,然后mylist in mylist
为true)。wztqucjr2#
您将看到 * 链式比较 *(更经典的例子是
a < b < c
)等于
所以它是有效的。
但如果你用括号保护一边,
然后在一侧生成一个布尔值,它解释了错误消息(错误消息因一侧而异,左侧的错误消息拒绝在字符串中查找布尔值,右侧的错误消息拒绝迭代布尔值)
是的,这种自然语言的东西是危险的,可以意外编译(见一个经典问题:How to test multiple variables for equality against a single value?)