每次调用函数时,函数内部的变量是否被销毁并重新初始化?
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
可能会提高性能,因此只需计算和绑定一次。
抱歉我不太清楚这个问题的最佳表达方式:
为了简单起见,如果我有一个函数:
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
可能会提高性能,因此只需计算和绑定一次。