使用"x *= -1."有什么优势,与"x *= -1"相比?

5
我正在查看一些Python的NumPy代码,其中包含如下行:

a = 1. # later on, `a` is multiplied by other floats
x *= -1.

“从我正确理解的角度来看,1.等同于1.0。”
“这样做有什么优点?相比于a=1x*=-1的方式,我能理解如果我之后要将ax除以一个整数,那么这样做可以避免忘记将它们转换为浮点数(假设我希望得到浮点数作为除法结果),但是还有其他原因吗?”
“例如,如果我知道a最终会变成一个浮点数,那么出于性能方面的考虑,直接初始化为浮点数是否更好?或者这只是为了清晰明确(表明ax都应该是浮点数)?”

1
可能出于清晰和避免错误的原因。 - Steven Rumbalski
3个回答

6

这样做更加清晰易懂。

虽然将浮点数乘以整数可能会导致一定的性能损失(因为需要将整数转换为浮点数),但这取决于编译器,并且不应该是一个足够大的惩罚,让人担心(除非你正在进行大量这样的操作)。

然而,这确实为清晰度打分。最终,您真的是在将一个浮点数乘以另一个浮点数,并且没有理由隐藏这个事实。如果ax应该是浮点值,请让它们成为浮点值。


0

我无法检测出任何输出差异。

>>> float(1.*-5.*0.*-1.).hex()
'0x0.0p+0'
>>> float(1.*-5.*0.*-1).hex()
'0x0.0p+0'
>>> float(1.*5.*0.*-1.).hex()
'-0x0.0p+0'
>>> float(1.*5.*0.*-1).hex()
'-0x0.0p+0'
>>> 

0

任何一款自重的编译器都会将常量提升为相应的类型。区别仅在于视觉效果。


2
但是Python的编译器并没有尝试做任何花哨的事情。即使在很多具有聪明编译器的语言中,编译器也不能随意更改表达式的类型,特别是如果这将导致不同的语义(正如您的答案似乎暗示的那样)-尽管如果该语言强制要求,则会更改类型,这是完全不同的问题。 - user395760
实际上,Blindy并没有说编译器会改变表达式的类型,而只是说它会提升常量。如果在Python或任何其他语言中进行此类转换与运行时有关,我会感到惊讶! - user109839
@eryksyn:你说得对!太多年的C编程(和教学)让我忘记了在Python中谈论(静态/编译时)变量类型是没有意义的事实... - user109839

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接