*args 在 manim ReplacementTransform 动画中的使用

Use of *args in manim ReplacementTransform animation

关于这段代码,我有一个问题,它转换了 TexMobject 的元素(例如,元素 2 转换为 8,3 转换为 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 星号 (*)?在这种情况下使用 *args 符号的目的是什么,如果列表理解没有它就可以工作?

你必须先了解几个概念:

  1. 列表理解仅适用于列表、元组、字典和集合。
  2. self.play()指的是Scene.play(),因为我们知道self指的是定义的class。
  3. ALL METHODS 具有以下形式:class.method(*args,**kwargs),或
class.method(*args_1, *args_2, *args_3, ..., *args_n,**kwargs_1, **kwargs_2, ..., **kwargs_m)

其中 args 是一个 LIST/TUPLA 而 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 解释器将无法理解所给出的参数,请记住这不是使用方法的方式。

运算符*被称为“扩展运算符”,它的作用是“取出”列表中的所有元素。更多信息 .