在 manim 中使用 *args 进行 ReplacementTransform 动画。
在 manim 中使用 *args 进行 ReplacementTransform 动画。
我有一个关于这段代码的问题,它可以将 TexMobject 中的元素进行转换(例如,将第二个元素转换为 8,第三个元素转换为 9 等):
changes = [ [(2,4,3), (8,11,9)], [(0,0), (7,10)] ] for pre_ind, post_ind in changes: self.play( *[ ReplacementTransform(formula[i].copy(), formula[j]) for i,j in zip(pre_ind, post_ind) ] ) self.wait() self.wait()
我看到使用了列表推导式生成索引对,但我不明白为什么在 self.play()
的方括号前要加上一个参数星号(*)?在这种情况下使用 *args 标记的目的是什么,如果列表推导式没有它也能正常工作?
admin 更改状态以发布 2023年5月22日
在此之前,您需要了解几个概念:
- 列表推导仅适用于列表、元组、字典和集合。
self.play()
是指Scene.play()
,因为我们知道self
是正在定义的类。- 所有方法都有以下形式:
class.method(*args,**kwargs)
或
class.method(*args_1, *args_2, *args_3, ..., *args_n,**kwargs_1, **kwargs_2, ..., **kwargs_m)
其中args
是一个LIST/TUPLE,kwargs
是一个字典。在这种情况下,Scene.play
是这样使用的:
Scene.play(Animation1(...), Animation2(...), ..., **kwargs) # Example: Scene.play(Write(mob1), Write(mob2), run_time=4) # But, this is the same as: Scene.play(*[Write(mob1), Write(mob2)], run_time=4) # Or better: Scene.play(*[Write(mobs) for mobs in [mob1,mob2]], run_time=4)
我想(您没有很清楚地表达),您是在说为什么无法像下面这样做:
Scene.play([ReplacementTransform(...) for _ in ...])
或者
Scene.play(ReplacementTransform(...) for _ in ...)
我们可以直观地理解这是一个语法错误,因为Python解释器无法理解所给出的参数,记住这不是使用方法的方式。
运算符*
称为“展开运算符”,它的作用是“取出”列表中所有的元素。更多信息请参考这里。