【问题标题】:python pass variable to function parameter [duplicate]python将变量传递给函数参数[重复]
【发布时间】:2015-05-22 21:26:53
【问题描述】:

我认为这是一个 python 初学者问题。

我的目标是将变量 (idx) 传递给作为参数给出的函数。

我试图包装函数调用,将变量作为参数传递,但由于某种原因,结果与我预期的不一样。

代码如下:

for idx, path in enumerate(paths):
  def _mf(t):
    return make_frame(t, idx)

  clip2 = VideoClip(_mf, False, 10)

此循环将迭代 2 个项目。并且两个剪辑会分别调用make_frame函数。 但是对于两个剪辑,第二个参数 (idx) 将始终为“1”。我不明白这个。

有人可以帮我吗?谢谢

【问题讨论】:

  • 当我寻找这个问题的正确副本时,请参阅 the official Python FAQ,它解释了这一点,以及如何做你想做的事。
  • 另外,如果您期望不同结果的原因是您了解词法范围,并且来自像 C++ 这样的语言,其中每个块(复合语句、嵌套语句、大括号...)都是作用域,Python 的不同之处在于大多数块不是作用域,只有函数和类定义。 (这有点过于简单化了,但已经足够接近了。)
  • 好的,所以_mf函数会通过迭代被覆盖,对吧?有什么解决办法?我来自 java 和 javascript 世界...
  • 不,每次迭代都会得到一个名为 _mf 的单独函数,每个函数都有自己单独的闭包——但它们都是同一个 idx 变量的闭包,其值为 @ 987654326@ 你打电话的时候。我在第一条评论中链接的常见问题解答以及链接的重复问题的答案都比我在评论中解释的要好得多,并在这不是您想要的情况下提供解决方法。
  • 在不知道您已经了解多少的情况下,很难确切地知道如何解释这一点,但简短的回答是“我的目标是传递一个变量”是错误的——这正是您正在做的,但您实际上想要 是传递当前值 一个变量。您可以通过将其作为默认参数值传递,或使用创建和返回新函数的函数,或functools.partial,或除了在变量上实际创建闭包之外的任何其他方法来做到这一点。

标签: python


【解决方案1】:

你可以试试:

def foo(idx):
    return lambda t: make_frame(t, idx)

for idx, path in enumerate(paths):
    clip2 = VideoClip(foo(idx), False, 10)

【讨论】:

  • 非常感谢,它正在工作。
  • 由于您在其他地方抱怨说我没有取消您纠正的错误答案,所以我去寻找并找到了这个。好吧,有人对此投了反对票,大概再也没有回来过。我不知道他们这样做是因为我的评论中存在同样的问题,还是只是其中一个人喜欢惩罚任何回答显然应该作为十字军东征的一部分而关闭的问题的人。但无论出于何种原因,我都无法撤消其他人的反对票。我可以删除我的评论,我会这样做。
  • @abarnert 好的,我收回。对不起
猜你喜欢
  • 1970-01-01
  • 2023-01-24
  • 2020-10-30
  • 2015-01-05
  • 1970-01-01
  • 2019-10-18
  • 2015-06-06
  • 2022-01-26
  • 1970-01-01
相关资源
最近更新 更多