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

士弘毅 2017-07-21 04:15:00
用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,就这样懵逼了。哪位大神可解疑惑?

...全文
831 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
士弘毅 2017-07-31
  • 打赏
  • 举报
回复
其实吧,没那么复杂。 a -= b-c 等价于 a = a-(b-c)。右边相对来说,是一个整体。
Nagatoyuki 2017-07-23
  • 打赏
  • 举报
回复
引用 7楼混沌鳄鱼 的回复:
immutable [quote=引用 6 楼 nagatoyuki 的回复:] [quote=引用 5 楼 xpresslink 的回复:] [quote=引用 4 楼 nagatoyuki 的回复:] [quote=引用 3 楼 xpresslink 的回复:] 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) 这是因为你的小学基础不好造成的。
lz犯的小学错误,但你说的也不完全正确 a += i 和 a = a + i 并不完全等价,只能说结果一样 前者指向一个新的对象,后者是在原来的对象进行修改 你print id(a)就知道不同了[/quote] 你在一本正经地胡说八道。 你print id(a)就知道每次都不同了[/quote] 我在一本正经地胡说八道还是你想问题简单? x=[1];print id(x);x=x+[2];print id(x) x=[1];print id(x);x+=[2];print id(x) 你去试试这种情况啊?莫非你都是用a+=1试的?[/quote] 你这不是来抬杠的么 楼主问的问题和我的回答都是基于一个隐含的前提下的 pai = 1 pa = 1 for i in range(1, n): 这些都是immutable数据类型。 [/quote]不是来抬杠只是来蹭分。谁想你这人受不得别人一点质疑,直接说人胡说八道本来看到lz的提问以为是上面你粘的回复,谁想是个低级错误
混沌鳄鱼 2017-07-22
  • 打赏
  • 举报
回复
在python里在做 “+”操作时,实际上是调用对象的__add__方法或__iadd__方法 在python里int, float, str等 这些immutable(不可变)对象,只有一个__add__方法,这个方法永远返回一个新的对象。我所说的id每次都不同就是基于这个说的。 对于list, dict, set这些mutable(可变) 对象都既有__iadd__方法又__add__方法,但是 + 操作时默认调用__iadd__方法,这个方法直接修改原始对象本身,返回None.
混沌鳄鱼 2017-07-22
  • 打赏
  • 举报
回复
immutable
引用 6 楼 nagatoyuki 的回复:
[quote=引用 5 楼 xpresslink 的回复:] [quote=引用 4 楼 nagatoyuki 的回复:] [quote=引用 3 楼 xpresslink 的回复:] 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) 这是因为你的小学基础不好造成的。
lz犯的小学错误,但你说的也不完全正确 a += i 和 a = a + i 并不完全等价,只能说结果一样 前者指向一个新的对象,后者是在原来的对象进行修改 你print id(a)就知道不同了[/quote] 你在一本正经地胡说八道。 你print id(a)就知道每次都不同了[/quote] 我在一本正经地胡说八道还是你想问题简单? x=[1];print id(x);x=x+[2];print id(x) x=[1];print id(x);x+=[2];print id(x) 你去试试这种情况啊?莫非你都是用a+=1试的?[/quote] 你这不是来抬杠的么 楼主问的问题和我的回答都是基于一个隐含的前提下的 pai = 1 pa = 1 for i in range(1, n): 这些都是immutable数据类型。
Nagatoyuki 2017-07-22
  • 打赏
  • 举报
回复
引用 5 楼 xpresslink 的回复:
[quote=引用 4 楼 nagatoyuki 的回复:] [quote=引用 3 楼 xpresslink 的回复:] 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) 这是因为你的小学基础不好造成的。
lz犯的小学错误,但你说的也不完全正确 a += i 和 a = a + i 并不完全等价,只能说结果一样 前者指向一个新的对象,后者是在原来的对象进行修改 你print id(a)就知道不同了[/quote] 你在一本正经地胡说八道。 你print id(a)就知道每次都不同了[/quote] 我在一本正经地胡说八道还是你想问题简单? x=[1];print id(x);x=x+[2];print id(x) x=[1];print id(x);x+=[2];print id(x) 你去试试这种情况啊?莫非你都是用a+=1试的?
混沌鳄鱼 2017-07-22
  • 打赏
  • 举报
回复
引用 4 楼 nagatoyuki 的回复:
[quote=引用 3 楼 xpresslink 的回复:] 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) 这是因为你的小学基础不好造成的。
lz犯的小学错误,但你说的也不完全正确 a += i 和 a = a + i 并不完全等价,只能说结果一样 前者指向一个新的对象,后者是在原来的对象进行修改 你print id(a)就知道不同了[/quote] 你在一本正经地胡说八道。 你print id(a)就知道每次都不同了
Nagatoyuki 2017-07-22
  • 打赏
  • 举报
回复
引用 3 楼 xpresslink 的回复:
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) 这是因为你的小学基础不好造成的。
lz犯的小学错误,但你说的也不完全正确 a += i 和 a = a + i 并不完全等价,只能说结果一样 前者指向一个新的对象,后者是在原来的对象进行修改 你print id(a)就知道不同了
混沌鳄鱼 2017-07-21
  • 打赏
  • 举报
回复
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) 这是因为你的小学基础不好造成的。
司码君 2017-07-21
  • 打赏
  • 举报
回复
楼主如果从数学运算方面来看,没有差别。 从字符串、列表方面来看,就有差别 其实就是在头上连接还是在末尾连接的区别 还有,不要和括弧高到一起去,那是优先级的问题!!
士弘毅 2017-07-21
  • 打赏
  • 举报
回复
最后 ,回到开始 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 显然是没加括号的原因。但是,为什么???

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧