写在前面
博主python小白,本篇主要对官方文档 上的知识点进行梳理,以便后续个人查阅使用。若有理解不到位,恳请批评指正。
目录
一、作用域和命名空间
- namespace (命名空间)是一个从名字到对象的映射。
- 一个函数的本地命名空间在这个函数被调用时创建,并在函数返回或抛出一个不在函数内部处理的错误时被删除。
- 作用域 是一个命名空间可直接访问的 Python 程序的文本区域。
- 作用域被静态确定,但被动态使用。
1.1 global变量、nonlocal变量
以官网上的代码为例子
def scope_test():
def do_local():
spam = "local spam"
def do_nonlocal():
nonlocal spam
spam = "nonlocal spam"
def do_global():
global spam
spam = "global spam"
spam = "test spam"
do_local()
print("After local assignment:", spam)
do_nonlocal()
print("After nonlocal assignment:", spam)
do_global()
print("After global assignment:", spam)
scope_test()
print("In global scope:", spam)
上述代码输入为:
After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam
从以上示例可以看出:
- do_local()中声明的spam是局部变量,它的作用域仅在do_local()内
- do_nonlocal()将spam声明成nonlocal变量,其作用域应是外层函数scope_test(),因此在do_nonlocal()对spam进行操作,即就是对外层函数的spam进行操作(ps:因此最外层函数是不能声明nonlocal变量的)
- do_global()将spam声明成global变量,其作用域应是全局,因此在do_global()对spam进行操作,是对函数外的全局变量spam进行操作,而不对任何层级的函数内的变量spam进行操作
二、类
- 类定义与函数定义 (def 语句) 一样,必须被执行才会起作用。
- 当进入类定义时,将创建一个新的命名空间,并将其用作局部作用域 — 因此,所有对局部变量的赋值都是在这个新命名空间之内。
class myclass:
i=<