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

Python变量作用域和相关的关键字

一.变量作用域

变量作用域(Variable Scope),决定了变量在代码的哪个部分是可见的(可访问的)和可修改的,理解作用域对于避免命名冲突、调试错误以及编写模块化代码至关重要。

Python遵循LEGB规则来查找变量

1.LEGB规则

当你在代码中使用一个变量名时,Python解释器会按照以下顺序查找该变量:

  1. L(Local):局部作用域
  2. E(Enclosing):嵌套/外层作用域
  3. G(Global):全局作用域
  4. B(Built-in):内置作用域

局部作用域:

指函数内部,在函数内部定义的变量,只能在函数内部访问

def my_func(): x = 10 print(x) print(x) # NameError: name 'x' is not defined

嵌套作用域:

当一个函数定义在另一个函数内部时,内部函数可以访问外部函数的变量(只读,不能修改)

如果要修改,要使用nonlocal关键字

嵌套作用域(外层函数内部,内层函数外部)中定义的变量在该嵌套作用域中被访问和修改

def outer(): a = 'Outer' def inner(): b = 'Inner' print(a, b) inner() outer() # Outer Inner
def outer(): a = 'Outer' def inner(): b = 'Inner' a = 'Hello Python' print(a, b) inner() print(a) outer() # Hello Python Inner # Outer

这里修改了a吗?其实并没有,inner()函数内部对a赋值其实只是新创建了一个局部变量a,a的值为“Hello Python”,外层a的值其实并没有修改

def outer(): a = 'Outer' def inner(): nonlocal a # 使用nonlocal关键字声明变量a是外层作用域的变量,而非局部变量 b = 'Inner' a = 'Hello Python' print(a, b) inner() print(a) outer() # Hello Python Inner # Hello Python

全局作用域:

全局作用域中的变量,是在文件顶层定义的变量,可以在文件的任何函数中读取

若要在函数中修改全局作用域中的变量,要使用global关键字

x = 'Java and Python and C' def my_function(): x = "C++ and JavaScript" my_function() print(x) # Java and Python and C
x = 'Java and Python and C' def my_function(): global x # 使用global关键字声明变量x是一个全局变量 x = "C++ and JavaScript" # 对全局变量x进行修改 my_function() print(x) # C++ and JavaScript

内置作用域:

如果没有自己定义的变量,Python会使用内置的名称

# 没有定义len变量 print(len('hello')) # 5 Python解释器会查找并使用内置的len()函数
# 自己定义了len变量 那么它会遮盖内置的len()函数 len = 100 print(len('hello')) # TypeError: 'int' object is not callable

可变对象的修改和赋值:

这是一个常见的误区。如果变量指向的是可变对象(如列表、字典),你可以在不声明global/nonlocal的情况下修改对象的内容,但不能重新赋值该变量名。

my_list = [1, 2, 3] def modify_list(): # 合法:修改对象内容,没有改变变量名 my_list 的指向 my_list.append(4) # 非法:重新赋值变量名,这会创建一个新的局部变量 my_list # my_list = [10, 20] modify_list() print(my_list) # 输出: [1, 2, 3, 4]
http://www.jsqmd.com/news/466054/

相关文章:

  • 买硒鼓买什么牌子好?格之格易加粉2 - yangyuan-shunfeng
  • 2026南通全屋定制小红书运营服务商推荐:抖音视频拍摄/抖音陪跑/新媒体运营/短视频培训/企业IP打造培训课程/选择指南 - 优质品牌商家
  • CSS 盒模型常见面试题及答案
  • Laravel 10.x重磅更新:全新特性解析
  • 课堂随笔小记(企业实训第三天)——2026/3/11
  • unsloth 安装在google colab
  • Spring 核心知识点全解析(IOC+AOP)
  • 基于Java springboot健身器材用品商城网站系统(源码+文档+运行视频+讲解视频)
  • 春节礼品推荐,养元六个核桃有“心”意也有“新”意 - yangyuan-shunfeng
  • 2026年IntelliJ IDEA最新下载、安装教程,附详细图文
  • 算法杂记内容2
  • 基于双重验证的多模态皮肤病变智能分析系统
  • JMeter脚本开发
  • AI原生应用开发:如何利用LLM实现自然语言理解
  • 7×24 小时 远程遥控,AiPy 管家 VS OpenClaw 助手,AiPy 凭实力 C 位出道!
  • 2026年自动变速箱维修选购攻略,泽丰专修是优选品牌 - 工业设备
  • 关于 Ubuntu22.0.4下载ros2时,无法定位软件包ros-humble-desktop 的解决办法
  • 伺服系统转动惯量离线辨识算法仿真:探索与实践
  • 深度解析:Z-Image-Turbo二次元画风加强神器 —— XB_ZIMAGE_TURBO_ECY LoRA模型 全面评测与使用指南
  • 新闻稿 过年送礼饮品推荐:养元六个核桃,以健康心意,赴新春之约 - yangyuan-shunfeng
  • ZS312芯片解析:8K视频传输新标杆
  • 探讨2026年玩具车市场,威盛达玩具车优质厂家排名如何 - 工业品牌热点
  • 【花雕动手做】拆解 75V 800W 八线有霍尔无刷电机调速驱动控制器
  • 电脑的时间怎么显示秒数?一秒钟就能实现!
  • pandownload的百度网盘不限速解析:我的下载速度从龟速到光速的秘密
  • 一文彻底搞懂 RAG(检索增强生成)—— 大模型的“外挂大脑”
  • Day3.
  • 提示工程文档化:提升模型一致性的关键
  • 2026年杭州篮球场悬浮地板选购攻略,环保型厂家口碑排名 - mypinpai
  • 2026年全国性价比高的自然式园林水景服务商推荐,专业营造实力大揭秘 - 工业推荐榜