在我正在阅读的python书中,在函数部分说"一旦程序执行从局部作用域返回被销毁。">
我理解作用域,但是"当程序执行返回时"是什么意思?返回点是函数调用之后的那行吗?
def spam():
eggs = 99
bacon()
print (eggs)
def bacon():
ham = 101
eggs = 0
spam()
假设您有以下程序:
def is_odd(a: int) -> bool:
if a % 2 == 1:
return true
else:
return false
x = is_odd(3)
y = is_odd(4)
当你考虑"程序执行"时,你需要考虑的是代码执行的顺序。在本例中:
def ...
->代码定义了一个新函数is_odd
。它捕获函数中的代码作为定义的一部分,但不执行该代码。x = is_odd(3)
->代码现在用参数3
调用已定义的函数is_odd()
。→if a % 2 == 1
→代码进行相等性检查。a
在本例中是3
,因为这是传入的参数。代码将首先对a
应用模运算符,得到值1
。然后对1
和1
进行相等运算,得到true
。然后进行if
的相等性检查,因为它是假的,所以它跳到else
块。- 在
else
内部返回true
。然后我们回到is_odd(3)
行。结果,false
赋值给x
。 - 然后执行
y = is_odd(4)
。重复上面的过程,但是is_odd()
返回false
,然后将其赋值给y。
因此,从本质上讲,"程序执行"是程序执行的每个增量步骤。当我们谈论函数的"调用"或"返回"时,我们实际上是跳到源代码的另一个点。但是正如我的例子所示,返回点正是您离开的地方:它不是下一行,而是函数调用的地方。当它试图解释这一行时,比如x = is_odd(3)
,它必须首先计算is_odd(3)
是什么,这样它才能将该值赋给x
。此时,它调用is_odd()
函数,并接受返回结果并将x = is_odd(3)
转换为x = true
,然后,它依次求值,从而在该作用域中赋值一个新变量。
只有当不再需要求值时,程序才会转到下一行。