编程语言
首页 > 编程语言> > Python源码学习笔记:Python作用域与名字空间

Python源码学习笔记:Python作用域与名字空间

作者:互联网

作用域与名字空间

注:本篇是根据教程学习记录的笔记,部分内容与教程是相同的,因为转载需要填链接,但是没有,所以填的原创,如果侵权会直接删除。

问题:

PI = 3.14

def circle_area(r):
    return PI * r ** 2

class Person(object):
    def __init__(self, name):
        self.name = name

    def say(self):
        print('i am', self.name)

以这个程序为例,代码中出现的每个变量的作用域分别是什么?程序中总共涉及多少个名字空间?Python又以怎样的顺序去查找一个变量呢?

1. 名字绑定

1.1 赋值

在Python中,变量只是一个与实际对象绑定起来的名字,变量定义本质上就是建立名字与对象的约束关系。因此,赋值语句本质上就是建立这样的约束关系,将右边的对象与左边的名字绑定起来:

a = 1

赋值语句是最基本的将名字与对象绑定的方式,除此之外还有很多其他方式都起到了这样的作用。

1.2 模块导入

当我们导入一个模块时,也会在当前上下文创建一个名字,并与被导入对象绑定。

# 在当前上下文创建一个名字test,与被导入的module对象绑定
import test

1.3 函数、类定义

# 函数名circle_area与function对象绑定
def circle_area(r):
    return PI * r ** 2

# 类名Person与类型对象绑定
class Person(object):
    def __init__(self):
        pass

1.4 as关键字

# 将名字t与module对象绑定
import test as t

2. 作用域

问题:当我们引入一个名字之后,它的可见范围有多大呢?

a = 1

def func1():
    print(a)  # 1

def func2():
    a = 2
    print(a)  # 2

print(a)  # 1

在不同的代码区域引入的名字,其影响范围是不一样的。第1行定义的a可以影响到func1,而func2中定义的a则不能。此外,一个名字可能会在多个代码区域中定义,但最终在某个代码区域中只能使用其中一个。

2.1 静态作用域

一个名字能够施加影响的程序正文区域,便是该名字的作用域。在Python中,一个名字在程序中某个区域能否起作用,是由名字引入的位置决定的,而不是运行时动态决定的。因此,Python具有静态作用域,也称为词法作用域。那么,作用域具体是如何划分的呢?

2.2 划分作用域

2.3 闭包作用域

2.4 类作用域

2.5 复杂嵌套

2.5.1 函数嵌套类
2.5.2 类嵌套类

3. 名字空间

3.1 Globals

3.2 Locals

3.3 Enclosings

3.4 Builtin

4. 问题与总结

标签:__,co,name,Python,作用域,源码,print,def
来源: https://blog.csdn.net/xiaoli_Jenny/article/details/123595005