【问题标题】:Python: defining functions on the flyPython:动态定义函数
【发布时间】:2010-02-08 15:06:26
【问题描述】:

我有以下代码:

 funcs = []
 for i in range(10):
   def func():
      print i
   funcs.append(func)

 for f in funcs:
   f()

问题是func 被覆盖了。即代码的输出为:

9
9
9
...

如果定义新函数,你会如何解决这个问题?

最佳解决方案是更改函数的名称。即:

for i in range(10):
   def func+i():
...

(或其他一些奇怪的语法)

【问题讨论】:

  • 不需要更改函数的名称。名字只是名字。一旦你将它分配给 funcs,你的函数的名称也可能是funcs[0]funcs[1]funcs[2] 等。具有不同名称的函数可能很重要的唯一原因是你是否在搞乱func.__name__。而且你不应该这样做。

标签: python lambda


【解决方案1】:

问题不在于 func 被覆盖,而在于 i 的值是在调用函数时评估的,而不是在定义函数时。如果您想在定义时评估i,请将其放在函数声明中,作为func 的默认参数。

funcs = []
for i in range(10):
    def func(value=i):
        print value
    funcs.append(func)

for f in funcs:
    f()

默认参数在定义函数时计算一次,因此递增循环不会影响它们。如果您使用,这将同样有效

def func(i=i):
    print i

但我使用名称 value 来明确在函数中使用的是哪个名称。

【讨论】:

    【解决方案2】:

    从另一个函数is safest返回func

    【讨论】:

      【解决方案3】:

      你可以试试

      for i in range(10):
          def func(j=i):
              print j
          funcs.append(func)
      for f in funcs:
          f()
      

      【讨论】:

        猜你喜欢
        • 2019-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-10
        • 2012-10-23
        相关资源
        最近更新 更多