【发布时间】: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