例如,在此代码中:
def product(list):
p =1
for i in list:
p *= i
return p
我找到了这段代码,但我需要能够解释它的每一部分。
答案 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 * b
和a *= b
之间存在差异?有三个原因同时出现,但可能会有更多。
*=
运算符(因此a * b
可能未定义,尽管存在a *= b
)。将一个非常大的值(例如一个巨大的矩阵)与一个数相乘有时可以更好地进行,以避免必须为结果分配内存(这可能在计算后通过赋值将其复制到原始变量中)。 a = a * b
内部...... tmp = a * b
和a = tmp
。*
运算符未实现。示例可以是表示计算机扬声器音量的类。将音量加倍可能有意义(volumeKnob *= 2
),而不建议使用(分配)计算它(x = volumeKnob * 2
?←没有任何意义,因为它什么都不做。)a
的类型不同,我不会期望或建议实施*=
运算符,因为它会产生误导。一个例子可能是a
和b
是向量,其乘法结果将是矩阵(或数字)。名称__imul__
已经表明它是用于迭代应用的,i。即不止一次。但是如果a
的类型发生了变化,那就会出现问题。答案 4 :(得分:4)
通常p *= i
与p = 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