打开《Python入门与实战》_一步步学会Python_8.4.2 案例解析
163
2023-10-19
【摘要】 本书摘自《Python编程从0到1 视频教学版》一书中第2章,第3节,作者是张頔。
2.3 作用域和栈帧
作用域描述的是某个名字在代码中的可见性。在函数内部首次赋值的变量名只能在该 函数内部使用,这就是作用域规则的例子。作用域规则是程序设计语言本身的核心特性。 函数创建了本地作用域,程序员可以放心地命名而无须担心会影响外部环境。有时在多层 作用域嵌套的情况下,程序员又需要访问外层作用域的名字以达到某种设计目的。
【学习目标】
·理解函数的本地作用域概念;
· 掌握访问外层作用域名字的方法;
。理解函数的调用栈概念;
· 了解对象生命期的概念;
· 了解使用闭包延长局部对象生命期的方法。
2.3.1 名字的查找
命名:命名是将对象绑定至名字的过程。对某个名字赋值就是将其绑定至对象的过程。
a =[1,2,31
如果是首次对a 赋值,这条语句将创建名字a 并将其绑定至一个列表。在以下几种情 况中会发生名字的绑定行为:
· 函数形参;
· import和 from… import …语句;
· 函数(或类)定义;
· 赋值语句;
· for循环头;
· as关键字之后。
del语句则会解除这种绑定关系并删除名字。
本地作用域: 在函数内部定义的名字属于函数的本地作用域(也称局部作用域)①, 只在该函数内可见。不在任何函数或类内部定义的名字属于模块层次,是全局 (global) 名字,在整个模块内可见。这里的全局是指模块,而非整个程序。在表达式中使用名字时, 解释器会首先在本地作用域查找其定义。举例来说,如果在函数 foo 中用到名字 a, 解释 器会首先查找函数foo 的本地作用域是否有a 的定义,如果有,就使用之。而对名字赋值 时,如果名字没有定义,则会定义名字。以下各种情况都在函数 foo的局部作用域中定义 了名字 a:
● 定义对象:
f= []foo():
·形参:
def foo(a):
· 循环变量:
def foo():
for a in range(5):
· 定义函数或类:
def foo():
def a():
·as 关键字或模块导入:
def foo():
from math import pi as a
对 Python 语法来说,这是很自然的设定。如果上述这些代码不是使用本地的名字a, 而是使用外层定义的a, 那么函数的编写者将无法正常地编写函数。上述操作都是将a 当
作左值,或者说是对a 的某种赋值操作。
向上查找规则: 在表达式中用到名字时,如果没有局部作用域定义,解释器将在上级 作用域寻找。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 18664393530@aliyun.com 处理,核实后本网站将在24小时内删除侵权内容。