【问题标题】:Why "('a' in arr) in arr" != "'a' in arr in arr"? [duplicate]为什么 "('a' in arr) in arr" != "'a' in arr in arr"? [复制]
【发布时间】: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

【问题讨论】:

    标签: python operators


    【解决方案1】:

    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

    【讨论】:

      【解决方案2】:

      我可能错了,但我认为 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,行为与您的解释预期的一样
      • @chepner:真的,谢谢!
      【解决方案3】:

      给定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

      【讨论】:

      • 我更正了。看看
      猜你喜欢
      • 2022-06-16
      • 1970-01-01
      • 1970-01-01
      • 2018-06-01
      • 1970-01-01
      • 2011-11-14
      • 2012-02-13
      • 2017-11-06
      • 2019-12-19
      相关资源
      最近更新 更多