Python变量作用域及global变量、LEGB原则详解与实例分析(最新进阶必备)

一、变量作用域

1、变量作用域概述

  • Python中能够影响变量作用域的代码段是def、class、lambda
  • if/else、try/except/finally、for、while不会改变变量的作用域,即这些代码块内部的变量,也可以在代码块外部访问
  • 变量的搜索路径:局部变量->全局变量

2、变量作用域案例分享


二、global变量分析

1、不同类型变量的定义

  • 全局变量:模块内、所有函数外、所有class外的变量
  • 局部变量:函数内的变量、class的方法内且不使用self.修饰的变量
  • 类变量:class内且不在class的方法内
  • 实例变量:class的方法内且使用self.修饰的变量

2、方法内默认可以使用全局变量

但是如果方法内对全局变量既读又写就要注意了:在方法内部不加global声明就对全局变量 的同名变量做赋值操作,赋值操作之前都无法访问该变量,因为该变量在方法内部已变成局部变量;如果在赋值操作之前就使用该变量,会报错 "变量在定义之前就被引用了"

3、在方法内定义全局变量

在方法内定义的非global变量只是局部变量,它无法在方法外部被访问到。

在方法内定义的global变量是全局变量,它可以在方法外部被访问到。 

4、在方法内修改str类型全局变量

由于str的特殊性,在Python中对str类型全局变量再次赋值时并没有修改变量的值而是重新创建了一个str变量,所以当我们在方法中对全局变量重新赋值后,再次使用这个全局变量时实际上用的是在方法中创建的新变量。

5、在方法内修改class类型全局变量

在Python中对class类型全局变量再次赋值是重新创建了一个class变量,如果只是对class类型全局变量中的某个属性再次赋值,则class变量还是原来的变量,而且对于class类型全局变量不建议对整个变量进行重新赋值。 

三、LEGB原则分析

1、概念分析

LEGB是Python中变量查找的四个作用域的缩写,当在Python中访问某个变量时,解释器会按照LEGB的顺序来查找变量,即首先在局部作用域中查找,如果没找到,则依次在外部作用域、全局作用域和内置作用域中查找,如果都没找到的话就会报错。四个作用域具体如下:

  • Local(局部作用域):指函数内部的作用域。在函数内部定义的变量都属于局部作用域
  • Enclosing(外部作用域):指包含函数的局部作用域,但不是全局作用域。这通常出现在嵌套函数中,外部函数的作用域对于内部函数来说就是外部作用域
  • Global(全局作用域):指模块级别的作用域。在模块顶层定义的变量都属于全局作用域,它们可以被模块中的所有函数访问
  • Built-in(内置作用域):指Python内置的名称空间,包含Python解释器内置的名称,如:print、id、__name__等

2、案例分享

查询内置作用域的内容:

print(dir(__builtins__))
# 执行结果
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EncodingWarning', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '__IPYTHON__', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'aiter', 'all', 'anext', 'any', 'ascii', 'bin', 'bool', 'breakpoint', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'display', 'divmod', 'enumerate', 'eval', 'exec', 'execfile', 'filter', 'float', 'format', 'frozenset', 'get_ipython', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'range', 'repr', 'reversed', 'round', 'runfile', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']

LEGB案例1:局部变量、外部函数变量、全局变量都存在

LEGB案例2:注释掉局部变量,外部函数变量、全局变量都存在

LEGB案例3:注释掉局部变量、外部函数变量,全局变量存在

四、总结

本文涵盖了局部变量、全局变量、类变量、实例变量、变量作用域、LEGB原则及案例,所用到的案例都是经过认真设计并层层深入,部分案例还保留了对比项,相信大家看到这里应该对Python中的变量有一个清楚的认识了。如果对您有帮助的话,请点赞、收藏、评论支持下,谢谢大家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

changuncle

若恰好帮到您,请随心打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值