我试图创建一个包含两个浮点数的元组.(4.0, 4.0), 例如.但是,由于两个花车是相同的,我写道4.0, * 2.
我想写的是:(4.0,) * 2.在Python中,将元组乘以一个整数表示为Python,以将元组与其自身连接起来.所以(4.0,) * 2 = (4.0,) + (4.0,) = (4.0, 4.0).好.
我不想做的是4.0 * 2(没有逗号).实际上,这将使浮子4.0本身乘以2:4.0 * 2 = 8.0.好.
但这些比赛都没有发生.而不是8.0或(4.0, 4.0),我有一个
TypeError: 'int' object is not iterable
Run Code Online (Sandbox Code Playgroud)
这个答案令我非常惊讶.这种语法如何导致迭代2(这是该表达式的唯一整数)?
这是优先事项,与错误的操作员解释混合在一起.
*(乘法)的优先级高于,:4.0, 4.0 * 2 = 4.0, (4.0 * 2) = (4.0, 8.0).在我的表达中,它不能被理解为,因为没有任何东西可以被两个乘以:4.0, <nothing> * 2.由于乘法是二元运算符,因此它必须具有左侧的值,该值必须是4.0,其本身.
这对于二元*运算符来说是完全正确的.但是,Python有一元运算*符,其优先级也高于,.这个一元运算符用于扩展可迭代的就地.当我们使用可变数量的参数定义或调用函数时,通常会出现这种情况:
def min(first, *others): ...
data = tuple(4, 5, 6, 7)
min(*data)
Run Code Online (Sandbox Code Playgroud)
我的表达式中使用了这个运算符.Python将其解释4.0, * 2为4.0, (*2)"一个元组,包含4.0第一个元素,后跟所有元素2".实际上,整数是不可迭代的,并且Python抱怨它.
作为证明,我们可以计算这个表达式,它实际上为*一元运算符提供了一个迭代:
>>> 4.0 , * ( 5.0 , 6.0 ) # equivalent of (4.0, (*(5.0, 6.0)))
(4.0, 5.0, 6.0)
Run Code Online (Sandbox Code Playgroud)