首页 > 解决方案 > 在 manim ReplacementTransform 动画中使用 *args

问题描述

我有一个关于这段代码的问题,它转换了 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()

我看到有一个用于生成索引对的列表理解,但我不明白为什么在方括号之前有一个 args 星号(*)self.play()?如果列表理解没有它,那么在这种情况下使用 *args 表示法的目的是什么?

标签: list-comprehensionargsmanim

解决方案


您必须先了解几个概念:

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

argsLIST/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 解释器将无法理解给出的参数,记住这不是使用方法的方式。

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


推荐阅读