这可能是一个比实际问题更具理论性的问题,因为它不会对程序的运行时间产生重大影响。至少不是我的情况。
我收到了一些导入不同(“自制”)函数的python代码。一个函数(称为 func )从主脚本调用5次(称为 main )。
在 func 中,在函数的开头定义了很多常量。例如:
import numpy as np
def func(x,y,z):
c0 = np.array([1,2,3])
c1 = np.array([1,2,3])
c2 = np.array([1,2,3])
c3 = np.array([1,2,3])
#do stuff with variables x,y,z
#return stuff
我想知道:调用这个函数时,每次调用函数时都会定义常量c0,...,c3,或者在运行 main <编译为字节码时它是“固定的”吗? / strong>脚本,以便它们只定义一次?
答案 0 :(得分:4)
c0
,c1
等的范围仅限于func
方法。所以,每次调用函数时,这些变量都将被初始化。
如果您希望仅将其初始化一次,然后在每次调用时在func
中使用它,则可以在func
方法之外进行定义:
import numpy as np
c0 = np.array([1,2,3])
c1 = np.array([1,2,3])
c2 = np.array([1,2,3])
c3 = np.array([1,2,3])
def func(x,y,z):
#do stuff with variables x,y,z
#return stuff
答案 1 :(得分:1)
是的,每次调用函数时都会定义它们。
Python的动态特性意味着np.array
的值可能在函数定义及其调用(以及调用之间)之间的时间内发生了变化,因此编译器没有机会对它们进行评估&#34;提前&#34;。
如果将它们保存在闭包中,则只能对它们进行一次计算,而不将它们作为全局变量引入。
示例:
def _func():
c0 = np.array([1,2,3])
c1 = np.array([1,2,3])
c2 = np.array([1,2,3])
c3 = np.array([1,2,3])
def actual_func(x, y, z):
# do stuff
# return stuff
return actual_func
_func_closure = _func()
def func(x, y, z):
return _func_closure(x, y, z)
最后一个定义只是为了避免在函数外部创建一个全局变量 - func = _func()
如果你不介意的话也同样有效。
这可能写得更优雅,但它说明了这个想法,基本上是&#34;增加一个间接水平&#34;。
免责声明:我完全不知道这是否有更好的表现。
(如果你对&#34;技巧和#34感兴趣;就像这样,在Lisp的任何体面的书中都有很多。)