我怀疑下面的代码有什么区别。我使用matplotlib的animation类来渲染numpy的数组。在atualizaMundo()
函数中,如果我使用mundo[:] = new_mundo[:]
,它工作得很好,但是如果我使用mundo=new_mundo
,数组将相等,但动画不起作用。这有什么区别?在
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
ON = 255
OFF = 0
def criaMundo(N):
return(np.random.choice([ON,OFF],N*N,p=[0.5,0.5]).reshape(N,N))
def atualizaMundo(frameNum,N,mundo,img):
new_mundo = np.random.choice([ON,OFF],N*N,p=[0.5,0.5]).reshape(N,N)
img.set_data(mundo)
mundo[:]=new_mundo[:]
#mundo=new_mundo
return(img,)
def main():
try:
N = 4
mundo = criaMundo(N)
print(mundo)
fig1,ax = plt.subplots()
img = ax.imshow(mundo)
animacao = animation.FuncAnimation(fig1, atualizaMundo, fargs=(N,mundo,img,), blit=True)
plt.show()
except Exception as ex:
pass
if __name__ == '__main__':
try:
main()
except Exception as fk:
pass
行
mundo[:]=new_mundo[:]
修改现有数组mundo
。因此,您总是在同一个对象上操作,对它所做的更改将反映在动画中。下一次动画调用函数时,同一对象作为参数传递,以便保留上一次调用中所做的更改。注意,mundo[:]=new_mundo[:]
等同于mundo[:]=new_mundo
。在{将一个新的数组赋值给>>>><。但是,它只是局部作用域,一旦函数完成,更改的
mundo
就不再存在了。在对函数的下一次调用中,旧的和未更改的mundo
再次传递给函数,导致静态动画。在应该注意的是,在这种情况下,实际上根本不需要传递
mundo
,因为您只需将新计算的数组new_mundo
直接设置为图像:img.set_data(new_mundo)
。在相关问题 更多 >
编程相关推荐