1 python变量名解析总结
点号和无点号变量名,用不同的处理方式。
(1) 无点号的变量名,比如X,使用的是作用域。
(2) 有点号的变量名,比如obj.X,使用对象的命名空间。
(3) 模块和类对对象的命名空间进行初始化。
1.1 无点号变量名
无点号变量名遵循LEGB作用域规则。
1.1.1 赋值本地变量
X = value
赋值语句,使变量名成为本地变量。
1.1.2 引用变量
引用变量X时根据LEGB作用规则搜索变量X:当前本地作用域搜索,之后在嵌套的函数中搜索,然后在全局作用域搜索,最后在内置作用域搜索。
1.2 点号变量名
点号的变量名是特定对象的属性。
1.2.1 命名空间赋值
obj.X = value
在进行点号运算的对象obj的命名空间内创建或修改属性名X。
1.2.2 引用点号变量
obj.X
类:先在对象内搜索变量名X,然后在可读取的超类上使用继承搜索变量名X。
模块:直接从模块读取X。
1.3 python变量名分类
python变量赋值位置决定了变量的作用域或命名空间,即变量可访问范围。
NO | 赋值位置 | 分类 | 描述 |
---|---|---|---|
1 | 模块顶层赋值 | 全局变量 | 都可访问 |
2 | 函数内部赋值 | 本地变量 | 函数内部可访问 |
3 | 方法内部赋值 | 本地变量 | 方法内部可访问 |
4 | 类主体内赋值 | 类数据属性 | 类、实例和行为可访问 |
5 | 方法self赋值 | 实例属性 | 实例可访问 |
1.3.1 模块内访问变量
# vars.py# 模块属性X = 91def f1():print(X)def f2():# 函数本地变量X = 92print(X)class C1(object):# 类属性X = 93def m1(self):# 方法本地变量X = 94# 实例属性self.X = 95if __name__ == '__main__':print(X)# 91f1()# 91f2()# 92print(X)# 91c = C1()print(c.X)# 93c.m1()print(c.X)# 95print(C1.X) # 93try:# 函数外不可访问本地变量print(f2.X)except Exception as e:print('f2.X={}'.format(e))try:# 方法外不可访问本地变量print(C1.m.X)except Exception as e:print('C1.m.X={}'.format(e))''' 运行结果E:\documents\F盘>python vars.py91919291939593f2.X='function' object has no attribute 'X'C1.m.X=type object 'C1' has no attribute 'm''''
1.3.2 模块外访问变量
>>> import os>>> os.chdir(r'E:\documents\F盘')>>> import vars>>> X = 96>>> print(X)96>>> print(vars.X)91>>> vars.f1()91>>> vars.f2()92>>> print(vars.C1.X)93>>> c = vars.C1()>>> print(c.X)93>>> c.m1()>>> print(c.X)95
1.3.3 global和nonlocal变量
python的global语句用于def函数内定义全局变量。在函数外也可以引用此变量。
python中如果要修改嵌套作用域变量的值,就用nonlocal语句。
>>> S = '梯阅线条'>>> def g1():print(S)>>> def g2():global SS = 'tyxt'>>> g1()梯阅线条>>> g2()>>> print(S)tyxt>>> def n1():S = 9555def n11():print(S)return n11>>> n1()()9555>>> def n2():S = 9555def n21():nonlocal Sprint(S)S = 9666print(S)return n21>>> n2()()95559666