消息关闭
    暂无新消息!

python a+=b 和 a=a+b的区别

问题作者 : 破解hbb2017-07-23发布
用python 写了段求π的函数
n = input("数\n")
# 求π的近似值
pai = 1
pa = 1
for i in range(1, n):
    pai -= 1.0 / (4 * i - 1) + 1.0 / (4 * i + 1)
    pa = pa - 1.0 / (4 * i - 1) + 1.0 / (4 * i + 1)
print 'pai=', 4 * pai,
print' pa = ', 4 * pa
随便输一个正整数,结果如下
pai= -6.51363180581    pa =  3.1466177475

以为可能和循环有关,写了下面:
s=a=1
for i in range(10):
    s+=i
    a=a+i
print s,a
但结果一样:
46 46

那可能和后面部分相关:
s=a=1
for i in range(2):
    s+=i +6
    a=a+i +6
print s,a
结果:14 14

额,可能和左元表达式有关。再试
pai = pa =1
for i in range(1, 3):
    pai -= 1.0 / (4 * i - 1) +3
    pa = pa - 1.0 / (4 * i - 1) +3
print 'pai=', 4 * pai,
print' pa = ', 4 * pa
结果:pai= -21.9047619048  pa =  26.0952380952

但是 
pai = pa =1
for i in range(1, 3):
    pai -= 1.0 / (4 * i - 1) 
    pa = pa - 1.0 / (4 * i - 1)
print 'pai=', 4 * pai,
print' pa = ', 4 * pa
结果:pai= 2.09523809524  pa =  2.09523809524

OK,就这样懵逼了。哪位大神可解疑惑?


4个回答

︿ 2
楼主如果从数学运算方面来看,没有差别。
从字符串、列表方面来看,就有差别
其实就是在头上连接还是在末尾连接的区别

还有,不要和括弧高到一起去,那是优先级的问题!!
︿ 2
在python里在做 “+”操作时,实际上是调用对象的__add__方法或__iadd__方法
在python里int, float, str等 这些immutable(不可变)对象,只有一个__add__方法,这个方法永远返回一个新的对象。我所说的id每次都不同就是基于这个说的。
对于list, dict, set这些mutable(可变) 对象都既有__iadd__方法又__add__方法,但是 + 操作时默认调用__iadd__方法,这个方法直接修改原始对象本身,返回None.
︿ 2
   a += i  和    a = a + i 是完全等价的

但是    pai -= 1.0 / (4 * i - 1) + 1.0 / (4 * i + 1)

和       pa = pa - 1.0 / (4 * i - 1) + 1.0 / (4 * i + 1)

这两个不等价。

要写成下面这样才是等价的。
pa = pa - (1.0 / (4 * i - 1) + 1.0 / (4 * i + 1))
或pa = pa - 1.0 / (4 * i - 1) - 1.0 / (4 * i + 1)

这是因为你的小学基础不好造成的。
︿ 0
最后 ,回到开始
n = input("数\n")
pai = 1
pa = 1
for i in range(1, n):
    pai -=(1.0 / (4 * i - 1) - 1.0 / (4 * i + 1))
    pa = pa - 1.0 / (4 * i - 1) + 1.0 / (4 * i + 1)
print 'pai=', 4 * pai,' pa = ', 4 * pa

结果:
10
pai= 3.19418790923  pa =  3.19418790923

显然是没加括号的原因。但是,为什么???