python变量名解析总结

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 = 91

def f1():
    print(X)
    
def f2():
    # 函数本地变量
    X = 92
    print(X)
    
class C1(object):
    # 类属性
    X = 93
    def m1(self):
        # 方法本地变量
        X = 94
        # 实例属性
        self.X = 95
        
if __name__ == '__main__':
    print(X)    # 91
    f1()        # 91
    f2()        # 92
    print(X)    # 91
    
    c = C1()
    print(c.X)  # 93
    
    c.m1()
    print(c.X)  # 95
    print(C1.X) # 93
    
    try:
        # 函数外不可访问本地变量
        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.py
91
91
92
91
93
95
93
f2.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 S
    S = 'tyxt'
    
>>> g1()
梯阅线条
>>> g2()
>>> print(S)
tyxt

>>> def n1():
    S = 9555
    def n11():
        print(S)
    return n11

>>> n1()()
9555
>>> def n2():
    S = 9555
    def n21():
        nonlocal S
        print(S)
        S = 9666
        print(S)
    return n21

>>> n2()()
9555
9666

你可能感兴趣的:(python,python)