【发布时间】:2020-02-25 18:02:01
【问题描述】:
为什么是('a' in arr) in arr != 'a' in arr in arr?
arr = [1, True, 'a', 2]
print(('a' in arr) in arr) # -> True
print('a' in arr in arr) # -> False
【问题讨论】:
为什么是('a' in arr) in arr != 'a' in arr in arr?
arr = [1, True, 'a', 2]
print(('a' in arr) in arr) # -> True
print('a' in arr in arr) # -> False
【问题讨论】:
Section 6.10 of the Python language reference 讨论比较运算符和比较链接。 in 被认为是一个比较运算符,因此其行为与 < 等相同。对于显式分组,x OP1 y OP2 z 等效于 x OP1 y and y OP2 z 对于任何两个比较运算符。
这意味着
'a' in arr in arr
不带括号,等价于
'a' in arr and arr in arr
arr本身不是元素,所以表达式为False.
括号禁用链接,所以
('a' in arr) in arr
像任何其他嵌套表达式一样被评估。 'a' in arr 首先被评估为值True,然后True in arr 被评估为也产生True。
【讨论】:
我可能错了,但我认为 in 就像任何二元运算符一样,所以就像你有 a < b < c 等价于 (a < b) and (b < c) 一样,你会有
a in b in c
相当于
(a in b) and (b in c)
'a' in arr 是 True,但 arr in arr 是 False,这就是为什么你有一个 False 值。
【讨论】:
arr2 = [[1, True, 'a', 2], [1, 2, 3]] 打印print('a' in arr in arr2) 返回True,行为与您的解释预期的一样
给定arr=[1,True,'a',2],
解码第一个表达式:('a' in arr) in arr,
一步一步
('a' in arr) in arr 计算结果为
(True) in [1,True,'a',2] 计算结果为
True
解码第二个表达式:('a' in arr in arr)
一步一步
('a' in arr in arr) 这相当于 ('a' in arr and arr in arr) 计算结果为 (True and False) 计算结果为 (False) 更多信息:优先级和关联性https://www.programiz.com/python-programming/precedence-associativity
【讨论】: