Python 为什么在if-else表达式';s的第二个条件导致将第一个条件强制转换为tuple
用逗号声明元组的语法很清楚,在我看到的任何地方,它都与大括号中的文字一起使用,例如Python 为什么在if-else表达式';s的第二个条件导致将第一个条件强制转换为tuple,python,if-statement,syntax,tuples,Python,If Statement,Syntax,Tuples,用逗号声明元组的语法很清楚,在我看到的任何地方,它都与大括号中的文字一起使用,例如(1,) 然而,python确实允许在不使用大括号的情况下使用逗号来声明元组,并且在一种特殊情况下存在奇怪的行为,请参见下面的代码 def ifElseExpressionTrailingComma(): return 1 if True else 0, def ifElseExpressionTrailingCommaWrapped(): return 1 if True else (0,)
(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隐式转换为元组吗?这只是操作顺序:
>>> 1 if True else 0,
(1,)
>>> (1 if True else 0),
(1,)
>>> 1 if True else (0,)
1
这只是操作顺序:
>>> 1 if True else 0,
(1,)
>>> (1 if True else 0),
(1,)
>>> 1 if True else (0,)
1
这是因为三元运算符(
a,如果b,否则c
)比“逗号”运算符强
您可以将其与逻辑或和和运算符进行比较,其中和强于或:
if foo and bar or bats:
# means:
if (foo and bar) or bats:
这是因为三元运算符(a,如果b,否则c
)比“逗号”运算符强
您可以将其与逻辑或和和运算符进行比较,其中和强于或:
if foo and bar or bats:
# means:
if (foo and bar) or bats:
这不是含蓄的。三元表达式被解析为一个值(一或零),然后尾随逗号使其成为元组。在第二种情况下,括号表示表达式的一个可能返回值是元组,另一个是整数。考虑到您编写的代码清楚地演示了这种行为,您所期望的答案并不明显。是的,逗号应用于三元的计算结果并不明显,因为它的优先级较低。谢谢,伙计们。@jonrsharpe代码确实显示了这一点,但为了完成我的回答,我试图找到记录的优先级,但无法@Chris_Rands逗号不是运算符:@jonrsharpe当然,谢谢!这不是含蓄的。三元表达式被解析为一个值(一或零),然后尾随逗号使其成为元组。在第二种情况下,括号表示表达式的一个可能返回值是元组,另一个是整数。考虑到您编写的代码清楚地演示了这种行为,您所期望的答案并不明显。是的,逗号应用于三元的计算结果并不明显,因为它的优先级较低。谢谢,伙计们。@jonrsharpe代码确实显示了这一点,但为了完成我的回答,我试图找到记录的优先级,但无法@Chris_Rands逗号不是运算符:@jonrsharpe当然,谢谢!