Python += 运算符可以修改原始引用?!

查看 117|回复 7
作者:moudy   
今天玩 sagemath+ipywidget 的动画渲染,发现下面这段代码对新手太友好了:
origin = (0,0)
frames = []
g = Graphics()
frames += [g]
for i in range(5):
  g += circle(origin, i*5)
  frames += [g]
animate(frames).show()
一开始我以为这段代码是错的,frames 里存了一堆同样的 g ,只会将最后一张照片画六遍,不会显示动画效果。
实际情况是每次 g+=都会修改 g 本身的引用。最后还真的生成了 6 帧内容不同的动画。
DOLLOR   
在 Python 里,有的数据类型执行 a += b 和 a = a + b 效果是不一样的
kneo   
不然你以为+=后面的=是什么意思……
my8100   
https://github.com/sagemath/sage/blob/c4363fc97eb67fb08073ea37ef88d633e9feb160/src/sage/plot/graphics.py#L1129
def __add__(self, other):
"""
If you have any Graphics object G1, you can always add any other
amount of Graphics objects G2,G3,... to form a new Graphics object:
``G4 = G1 + G2 + G3``.
NessajCN   
+= 的不是 g 是 frames 啊…
Python 里 list += anotherlist 等于 list.extend(another_list)
my8100   
写成这样会清楚一些吧:
g_all = Graphics()
g_all = g_all + circle(origin, i*5)
frames.append(g_all)
zeromake   
得去看 Graphics 的符号重载实现
geelaw   
a+=b 的意思是 a=a.__iadd__(b) 或者 a=a.__add__(b) 或者 a=b.__radd__(a),注意这些方法的返回值是任意的,即使是第一种情况也不需要修改 a 并返回 a 。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部