每次调用函数时,函数内部的变量是否被销毁并重新初始化?

Are variables inside functions destroyed and re-initialized everytime the function is called?

抱歉我不太清楚这个问题的最佳表达方式:

为了简单起见,如果我有一个函数:

def add_number(num):
    to_add = 2 + 4
    return to_add + num

和主要的:

def __main__():
    add_number(5)
    add_number(10)
    add_number(25)

变量to_add是否在程序离开函数作用域时销毁,并在每次调用函数时重新初始化?在这种情况下的意思是,2+4 计算了 3 次吗?还是解释器缓存在内存中。

显然,在此示例中,每次计算 to_add 几乎没有什么缺点,但是如果要调用该函数数百次,并且如果 to_add 需要更多操作来计算它会使程序变慢。

您可以通过 dis 模块准确查看解释器对您的代码执行的操作。

add_number()的反汇编可以看出:

>>> from dis import dis
>>> dis(add_number)
  2           0 LOAD_CONST               1 (6)
              2 STORE_FAST               1 (to_add)

  3           4 LOAD_FAST                1 (to_add)
              6 LOAD_FAST                0 (num)
              8 BINARY_ADD
             10 RETURN_VALUE

变量to_add在函数每次运行时绑定在函数开头的本地命名空间。但是,您会注意到 2+4 已被编译器简化为 6

如果 to_add 是一个更复杂的表达式,通过在函数外部设置 to_add 可能会提高性能,因此只需计算和绑定一次。