当前位置: 首页 > news >正文

python---变量作用域

文章目录

  • 1、局部作用域 (Local - L)
  • 2、闭包函数作用域 (Enclosing - E)
  • 3、 全局作用域 (Global - G)
  • 4、 内建作用域 (Built-in - B)
  • 作用域查找规则 (LEGB规则)
    • 变量查找细节
  • global和nonlocal关键字
    • 1、global
    • 2、nonlocal
  • 注意事项

Python中的变量作用域决定了在程序的哪些部分可以访问某个变量。
Python有4种主要的作用域。

1、局部作用域 (Local - L)

在函数内部定义的变量属于局部作用域,只能在函数内部访问。

def my_func():x = 10  # 局部变量print(x)my_func()  # 输出: 10
print(x)   # 报错: NameError: name 'x' is not defined

2、闭包函数作用域 (Enclosing - E)

对于嵌套函数,外部函数的变量对内部函数是可见的。

def outer():y = 20  # 闭包作用域变量def inner():print(y)  # 可以访问外部函数的变量inner()outer()  # 输出: 20

3、 全局作用域 (Global - G)

在函数外部定义的变量或在函数内部用global关键字声明的变量。
z = 30 # 全局变量

def func():
print(z) # 可以访问全局变量

func() # 输出: 30

4、 内建作用域 (Built-in - B)

包含Python内建函数和异常的名称,如print(), len(), Exception等。

作用域查找规则 (LEGB规则)

当访问一个变量时,Python会按照以下顺序查找:
1、局部作用域 (L)
2、最近的闭包作用域 (E)
3、全局作用域 (G)
4、内建作用域 (B)

变量查找细节

# 代码报错,因为定义了局部变量a,但是在局部变量a之前在函数内调用啊
a = 1
def outer():print(a)a = 2print(a)def inner():passinner()outer()  

在这里插入图片描述

局部变量变化未影响全局变量

a = 1
def outer():a = 2print(a)def inner():passinner()outer()  
print(a)	# 输出 2 1

global和nonlocal关键字

1、global

在函数内部声明变量为全局变量
global代码示例1:

# 报错,golbal声明之前不允许声明局部变量
a = 1
def outer():a = 2global aprint(a)def inner():passinner()outer()  
print(a)

在这里插入图片描述
正确写法:

a = 1
def outer():global aa = 2print(a)def inner():passinner()outer()  
print(a)

2、nonlocal

在嵌套函数中声明变量来自外层(非全局)作用域

def outer():x = 10  # 外部函数变量def inner():nonlocal x  # 声明x来自外部函数x = 20      # 修改外部函数的xinner()print(x)  # 输出: 20outer()

多层函数嵌套下的nonlocal关键字

def outer():x = 10def middle():x = 20def inner():nonlocal x  # 找到middle的x,而不是outer的xx = 30inner()print("middle x:", x)  # 输出: middle x: 30middle()print("outer x:", x)  # 输出: outer x: 10outer()

注意事项

1、在函数内部,如果只是读取全局变量而不修改,不需要使用global声明

2、如果要在函数内部修改全局变量,必须使用global声明

3、类中的变量作用域规则与函数不同,类变量可以通过实例或类名访问

4、Python没有块级作用域(如if/for/while语句块不会创建新的作用域)

http://www.dtcms.com/a/323597.html

相关文章:

  • 零拷贝技术:提升传统I/O的性能
  • 【C++】string 的特性和使用
  • 欢迎走进《励曼旋耕》
  • LintCode第547题-两数组的交集
  • leetcode 49. 字母异位词分组 - java
  • [激光原理与应用-202]:光学器件 - 增益晶体 - Nd:YVO₄增益晶体的制造过程与使用过程
  • vite面试题及详细答案120题(61-90)
  • 简单聊聊PowerShell
  • Effective C++ 条款32:确定你的public继承塑模出 is-a 关系
  • 【读代码】深度解析 SmolAgents Open Deep Research
  • 杰理-AW-断言-log
  • 计算机网络基础(三)
  • [Shell编程] Shell 函数
  • PyQt5技术栈简述
  • .htaccess 文件上传漏洞绕过总结
  • Linux文件操作详解:一切皆文件
  • 编辑距离-二维动态规划
  • SkyWalking-3--Java Agent开发和集成示例
  • AI智能编程工具汇总
  • ComfyUI版本更新---解决ComfyUI的节点不兼容问题
  • MySQL 主备(Master-Slave)复制 的搭建
  • SOLIDWORKS 2025对工具栏等进行了重新布局和优化
  • GoEnhance AI-AI视频风格转换工具
  • gRPC 全面解析与实战 —— 从原理到同步/异步开发全攻略
  • Linux系统编程——进程地址空间
  • GM3568JHF:FPGA+ARM异构开发板环境搭建教程
  • 嵌入式学习day23-shell命令
  • Qdrant Filtering:must / should / must_not 全解析(含 Python 实操)
  • 【Python 高频 API 速学 ②】
  • 【线程池】压测确定线程池合适的参数