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

时间:2021-07-15 22:56:24

标签: python-3.x function performance memory scope

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

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

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 需要更多的操作来计算它会减慢程序速度。

1 个答案:

答案 0 :(得分:1)

您可以通过 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 来提高性能,因此只需计算和绑定一次。