簡體   English   中英

為什么有些語句僅適用於 manim 中 for 循環的最后一次迭代?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM