在python中* =意味着什么?

时间:2013-10-21 11:31:24

标签: python

例如,在此代码中:

def product(list):
    p =1
    for i in list:
        p *= i
    return p

我找到了这段代码,但我需要能够解释它的每一部分。

5 个答案:

答案 0 :(得分:9)

这是

的简写
p = p * i

这类似于更频繁遇到的p += i

答案 1 :(得分:5)

取自谷歌的第一个结果:

  

乘以AND赋值运算符,它将右操作数与左操作数相乘,并将结果赋值给左操作数

*=p = p * i相同。

This link包含各种精彩组合中所有运算符的列表。

示例

您的代码的伪代码说明如下:

assume list := {4, 6, 5, 3, 5, 1}
p := 1.

for(each number in list)
    p = the current value of p * the current number.
    // So: 1 * 4, 4 * 6, 24 * 5, 120 * 3...

return p. 

答案 2 :(得分:4)

与<{1}}完全相同

p = p * i

然而输出大致相同,所以你应该这样对待它

答案 3 :(得分:4)

运营商a *= b背后的想法与a = a * b的含义相同。在大多数情况下(如在你的情况下),它将完全如此,因此它将变量与值相乘并再次将结果存储在变量中。

使用*=的符号可能更快(取决于所涉及的类),并且在任何情况下,它都是更清晰的版本,因此它应该受到青睐。它的主要优点是,变量a本身已经是一个复杂的表达式,如myGiantValueField[f(42)].getValue()[3]

myGiantValueField[f(42)].getValue()[3] = myGiantValueField[f(42)].getValue()[3] * 3

肯定是不太可读,并且由于代码翻倍比

更容易出现修复错误
myGiantValueField[f(42)].getValue()[3] *= 3

但是,通常情况下,运算符*=会调用变量__imul__()的方法a并移交参数b,因此它与a.__imul__(b)完全相同{1}}(这不是那么直观)。

为什么a = a * ba *= b之间存在差异?有三个原因同时出现,但可能会有更多。

  1. 由于性能方面的原因,类可以实现 *=运算符(因此a * b可能未定义,尽管存在a *= b)。将一个非常大的值(例如一个巨大的矩阵)与一个数相乘有时可以更好地进行,以避免必须为结果分配内存(这可能在计算后通过赋值将其复制到原始变量中)。 a = a * b内部...... tmp = a * ba = tmp
  2. 类可能会使用直接乘法发现它的使用不直观,因此它可能会使*运算符未实现。示例可以是表示计算机扬声器音量的类。将音量加倍可能有意义(volumeKnob *= 2),而不建议使用(分配)计算它(x = volumeKnob * 2?←没有任何意义,因为它什么都不做。)
  3. 如果乘法结果的类型与a的类型不同,我不会期望或建议实施*=运算符,因为它会产生误导。一个例子可能是ab是向量,其乘法结果将是矩阵(或数字)。名称__imul__已经表明它是用于迭代应用的,i。即不止一次。但是如果a的类型发生了变化,那就会出现问题。

答案 4 :(得分:4)

通常p *= ip = p * i相同。

有时它可能会有所不同,我认为已经发布的解释对此不够明确,所以:

当p是可变对象时可能会有所不同。在这种情况下,就地*=可以修改原始对象而不是创建新对象。比较每个中q的情况:

>>> p = q = [2]
>>> p *= 5
>>> p
[2, 2, 2, 2, 2]
>>> q
[2, 2, 2, 2, 2]

>>> p = q = [2]
>>> p = p * 5
>>> p
[2, 2, 2, 2, 2]
>>> q
[2]

如果p是具有副作用的复杂表达式,因为原位版本仅评估子表达式一次,因此也可能不同。例如:

aList[randint(0, 5)] *= 3

与:

不同
aList[randint(0, 5)] = aList[randint(0, 5)] * 3