【问题标题】:Why trailing comma in if-else expression's second condition causes first condition to be casted to tuple为什么 if-else 表达式的第二个条件中的尾随逗号会导致第一个条件被强制转换为元组
【发布时间】:2017-10-03 22:50:40
【问题描述】:

用逗号声明元组的语法很清楚,我在任何地方看到它都与用大括号括起来的文字一起使用,例如(1,)

但是,python 确实允许使用逗号而不用大括号来声明元组,并且在一种特殊情况下会出现奇怪的行为,请参见下面的代码。

def ifElseExpressionTrailingComma():
    return 1 if True else 0,

def ifElseExpressionTrailingCommaWrapped():
    return 1 if True else (0,)

print ifElseExpressionTrailingComma()
print ifElseExpressionTrailingCommaWrapped()

输出:

(1,) # what??
1

在 2.7 和 3.5 上测试。 有人可以解释为什么 1 被隐式转换为元组吗?

【问题讨论】:

  • 这不是隐含的。三元表达式被解析为单个值,一个或零,然后尾随的逗号使其成为一个元组。在第二种情况下,括号表示表达式的一个可能返回值是一个元组,另一个是整数。鉴于您编写的代码清楚地展示了这种行为,您期望得到什么样的答案并不明显。
  • 是的,逗号应用于三元的评估结果并不是很明显,因为它的优先级较低。谢谢,伙计们。
  • @jonrsharpe 代码确实显示了这一点,但为了完成我的回答,我试图找到记录的这个优先级,但不能docs.python.org/3.6/reference/…
  • @Chris_Rands 逗号不是运算符:docs.python.org/3/faq/…
  • @jonrsharpe 当然,谢谢!

标签: python if-statement syntax tuples


【解决方案1】:

这只是操作的顺序:

>>> 1 if True else 0,
(1,)
>>> (1 if True else 0),
(1,)
>>> 1 if True else (0,)
1

【讨论】:

    【解决方案2】:

    这是因为三元运算符(a if b else c)比“逗号”运算符强。

    您可以将其与andor 更强的逻辑orand 运算符进行比较:

    if foo and bar or bats:
    
    # means:
    if (foo and bar) or bats:
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 2015-12-24
      • 2020-09-29
      相关资源
      最近更新 更多