【问题标题】:Passing repeated arguments to looped function将重复的参数传递给循环函数
【发布时间】:2015-11-10 23:34:48
【问题描述】:

假设我在一个循环中有一个函数,它接受多个参数,但实际上只有一个参数在循环的迭代中发生变化。

例子:

for i in range(10):
   function(i, a, b, c, d, e)

我是否会因为反复将参数 a、b、c、d、e 传递给函数而失去速度?我对如何以“类似引用”的方式传递所有可变类型的理解有些模糊。有什么更好的方法来做到这一点?

我试过了:

a =
b =
...

def function(i)

for i in range(10):
   function(i)

它似乎有效。

令人沮丧的是,以下内容似乎不起作用,我在理解网上解释为什么不成功方面并不是很成功:

from somemodule import function 

for i in range(10):
   function(i)

其中函数定义同上。我不断收到“找不到全局变量 a、b、c ...”错误。

【问题讨论】:

  • 好吧,你的代码不完整,但我猜在第二种情况下,函数是在somemodule中定义的,但变量ab,...不是.由于模块在 Python 中提供范围,因此您应该在 somemodule 中定义这些变量。如果我弄错了,请您提供 MWE 吗?
  • 在您的第二种情况下,ab 分配(读取定义)在哪里?

标签: python loops global-variables local


【解决方案1】:

您是否尝试过以这种方式指定变量:

global a
global b
.....

否则,如果在任何函数中声明了这些变量,则将其视为局部变量,并且它的实例只能在声明的函数中使用。如果您将其指定为全局,则它可以在脚本中的任何位置使用。
这是您遇到的唯一错误,对吗?

【讨论】:

  • global a 允许您在函数内为全局名称a 赋值。如果您只需要引用它(即在表达式中使用它)global 是不必要的。请参阅 LEGB 范围规则。
  • 虽然这可以“解决”错误(这还不清楚),但通常认为使用全局变量是一种不好的做法。由于 OP 表明他/她是 python 的新手,我建议不要这样做。 99% 的时间global 可以使用适当的范围来避免。有关在 python 中使用 global 的 cmets,请参阅这些帖子:stackoverflow.com/a/4693385/1620879 stackoverflow.com/a/19158418/1620879
【解决方案2】:

名称 a、b、c ... 必须在 somemodule 中定义才能正常工作,然后 function 使用这些值。

由于您的代码不完整,我只能猜测..
您应该使用默认参数或functools.partial

它们产生不同的结果,但我认为其中一种符合您的需求。

【讨论】:

    猜你喜欢
    • 2017-10-30
    • 2020-05-15
    • 2022-01-26
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多