名称和对象
对象是类的实例化,对象之间相互独立,但不同作用域下的不同名称可以绑定到同一个对象
命名空间和作用域
命名空间
命名空间是从名称到对象的映射,大部分命名空间都是通过Python字典来实现的。命名空间内不能有重名,但是不同命名空间可以重名而没有任何影响,注意区分模块,内置名称 > 全局名称 > 局部名称
- 内置名称
python解释器启动时创建,永远不会被删除
例如,ads、char、BaseException、Exception等 - 全局名称
读取模块定义时创建,持续到解析器退出 - 局部名称
调用函数时创建,在函数返回或抛出不在函数内部处理的错误时被删除
作用域
命名空间可直接访问的 Python 程序的文本区域
python中访问变量,会从内到外,依次访问所有作用域直到找到,否则报错未定义
顺序:局部作用域Local → (外部嵌套作用域Enclosing)→ 全局作用域Global → 内置模块作用域Built-in
只有模块、类、函数才会引入新的作用域,其他代码块内定义的变量,外部也可以访问
# if中声明的变量a,外部仍可访问
if 1 > 0:
a = 1
print("a =", a)
# 输出结果 a = 1
全局变量,将引用和赋值直接指向包含该模块的全局名称命名空间,调用函数时,所有函数内声明的名称都会加到作用域中
局部变量,仅在被声明的函数内访问
关键字
global
,局部作用域影响到全局作用域
a = 1
def fun():
global a
print(a) # 结果为1
a = 2
print(a) # 结果为2
fun()
print(a) # global声明后结果为2,否则为1
nonlocal
,嵌套作用域影响到局部作用域
def outer():
a = 1
def inner():
nonlocal a
print(a) # 结果为1
a = 2
print(a) # 结果为2
inner()
print(a)# nonlocal声明后结果为2,否则为1
outer()