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

问题描述

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

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

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...