[英]Why are some statements working only for the last iteration of the for loop in manim?
我正在嘗試創建一個動畫,我想要一個點和線列表來跟蹤一個值。 為此,我正在使用 ValueTracker 對象和更新程序方法。 使用 ShowCreation,我已經將這些對象添加到場景中。 我使用 for 循環為列表中的每個點和線添加一個更新程序(兩個列表的長度相同):
for i in range(len(x_points)):
dots_cos[i].add_updater(
lambda mob: mob.move_to(axes2.c2p(x_points[i], np.cos(omega.get_value()*x_points[i]))),
# call_updater=False
)
dots_sin[i].add_updater(
lambda mob: mob.move_to(axes2.c2p(x_points[i], np.sin(omega.get_value()*x_points[i]))),
# call_updater=False
)
lines_cos[i].add_updater(
lambda mob: mob.become(Line(axes2.coords_to_point(x_points[i], 0),
axes2.coords_to_point(x_points[i], np.cos(omega.get_value()*x_points[i])), color=YELLOW)),
# call_updater=False
)
lines_sin[i].add_updater(
lambda mob: mob.become(Line(axes2.coords_to_point(x_points[i], 0),
axes2.coords_to_point(x_points[i], np.sin(omega.get_value()*x_points[i])), color=RED)),
# call_updater=False
)
這沒有按預期工作! 發生的事情是,只有相應列表中的最后一個元素得到了更新程序,並且正常工作,而其余元素只是從場景中消失了! 我嘗試在zip(x_points, dots_cos, dots_sin, lines_cos, lines_sin)
上運行 for 循環,但結果仍然相同。
有趣的是,當我嘗試使用 while 循環執行相同操作時,而不是循環的最后一次迭代,代碼嘗試向最后一次 + 1 迭代添加更新程序,因此拋出了 IndexOutOfBounds 異常。 盡管像打印語句這樣的良性語句在 while 循環中運行良好。
此外,如果它很重要,點和線的列表是使用返回這些列表的用戶定義函數生成的。
那么這里的問題是什么? add_updater 函數如何破壞像 for 循環這樣基本的東西?
您遇到了一個眾所周知的在循環中構造 lambda 的問題。 您的解決方案可能是:
lambda mob, i=i: ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.