Python中变量之间赋值的理解

发布时间:2026/9/23 13:08:00

Python中变量之间赋值的理解 Python中变量之间赋值的理解引言从变量本质说起在 Python 中变量与其他编程语言如 C/C有着本质的不同。Python 变量更像是一个“标签”或“名字”而不是一个“盒子”或“容器”。理解这一点是掌握变量之间赋值的核心。本文将结合大量代码示例从底层机制到实际应用深入剖析 Python 变量赋值的原理。## 一、变量的基本概念标签 vs 容器### 1.1 传统语言中的变量类比 C 语言在 C 语言中变量是内存中的一块区域赋值操作是将值“复制”到该区域。例如cint a 10; // 声明一个 int 类型的变量 a并分配 4 字节内存存入 10int b a; // 将 a 的值复制到 bb 拥有独立的内存### 1.2 Python 中的变量引用对象的名字Python 的变量本质上是对象的“引用”reference。每个 Python 对象都有唯一的身份id而变量只是指向这个对象的标签。python# 示例 1理解变量本质a 10 # 创建一个整数对象 10让变量 a 指向它b a # 让变量 b 指向同一个整数对象 10print(fa 的值: {a}, id: {id(a)})print(fb 的值: {b}, id: {id(b)})print(fa 和 b 指向同一对象: {id(a) id(b)}) # 输出 True输出结果a 的值: 10, id: 140725846216304b 的值: 10, id: 140725846216304a 和 b 指向同一对象: True关键点a和b共享同一个整数对象没有发生数据复制。这是 Python 赋值的第一条黄金法则赋值操作只是创建或修改变量到对象的绑定关系不会复制对象本身。—## 二、可变对象与不可变对象赋值的核心差异Python 中的对象分为两大类可变对象如列表、字典、集合和不可变对象如整数、字符串、元组。这两种类型在变量赋值时表现截然不同。### 代码示例 1不可变对象整数的赋值行为python# 示例代码 1不可变对象 - 整数x 100y x # y 指向 x 指向的对象整数 100print(f初始状态: x{x}, y{y})# 尝试修改 x实际上创建新对象x 200 # 整数不可变所以 Python 创建新对象 200让 x 指向它print(f修改 x 后: x{x}, y{y})print(fx 的 id 变化: {id(x)}, y 的 id 仍为: {id(y)})print(fx 和 y 是否指向同一对象: {id(x) id(y)})输出结果初始状态: x100, y100修改 x 后: x200, y100x 的 id 变化: 140725846217072, y 的 id 仍为: 140725846216976x 和 y 是否指向同一对象: False分析- 整数 100 是不可变对象所以x 200不会修改原对象而是创建新整数对象 200。-y仍然指向原来的整数 100互不影响。这符合直觉“修改一个变量另一个不受影响”。### 代码示例 2可变对象列表的赋值行为python# 示例代码 2可变对象 - 列表list_a [1, 2, 3] # 创建列表对象 [1,2,3]list_b list_a # list_b 指向同一个列表对象print(f初始状态: list_a{list_a}, list_b{list_b})print(f初始 id 相同: {id(list_a)} {id(list_b)} → {id(list_a) id(list_b)})# 通过其中一个变量修改列表修改原对象list_a.append(4) # 直接修改对象内容不创建新对象print(f修改 list_a 后: list_a{list_a}, list_b{list_b})print(f修改后 id 仍相同: {id(list_a)} {id(list_b)} → {id(list_a) id(list_b)})# 另一个变量也受影响因为指向同一对象list_b[0] 99 # 通过 list_b 修改列表print(f修改 list_b 后: list_a{list_a}, list_b{list_b})输出结果初始状态: list_a[1, 2, 3], list_b[1, 2, 3]初始 id 相同: 140725846217032 140725846217032 → True修改 list_a 后: list_a[1, 2, 3, 4], list_b[1, 2, 3, 4]修改后 id 仍相同: 140725846217032 140725846217032 → True修改 list_b 后: list_a[99, 2, 3, 4], list_b[99, 2, 3, 4]分析- 列表是可变对象list_a.append(4)或list_b[0] 99直接修改原对象不创建新对象。- 变量list_a和list_b始终指向同一个列表对象所以一个变量修改内容另一个变量“被动”受影响。- 这是 Python 赋值中最常见的大坑开发者以为复制了数据实际上只是复制了引用。—## 三、变量赋值的三种常见场景### 3.1 直接赋值共享引用这是最基础的形式如a b。结果就是两个变量指向同一对象。pythona [1, 2, 3]b a # 共享引用print(b is a) # True验证指向同一对象### 3.2 浅拷贝copy.copy()创建新对象但共享子对象使用copy模块的copy()函数可以创建对象的新副本但对于嵌套对象只复制引用。pythonimport copyoriginal [[1, 2], [3, 4]]shallow copy.copy(original) # 浅拷贝print(foriginal: {original}, id: {id(original)})print(fshallow: {shallow}, id: {id(shallow)})print(f外层对象不同: {id(original) ! id(shallow)}) # True# 修改嵌套列表original[0].append(99)print(f修改后 original: {original})print(f修改后 shallow: {shallow}) # 受影响因为子列表对象共享输出结果original: [[1, 2], [3, 4]], id: 140725846217032shallow: [[1, 2], [3, 4]], id: 140725846217192外层对象不同: True修改后 original: [[1, 2, 99], [3, 4]]修改后 shallow: [[1, 2, 99], [3, 4]]### 3.3 深拷贝copy.deepcopy()完全独立的副本深拷贝递归复制所有嵌套对象得到完全独立的新对象。pythonimport copyoriginal [[1, 2], [3, 4]]deep copy.deepcopy(original) # 深拷贝# 修改嵌套列表original[0].append(99)print(f修改后 original: {original})print(f修改后 deep: {deep}) # 不受影响输出结果修改后 original: [[1, 2, 99], [3, 4]]修改后 deep: [[1, 2], [3, 4]]—## 四、实际开发中的陷阱与最佳实践### 4.1 函数参数传递的本质Python 函数参数传递也是赋值操作因此可变对象在函数内修改会影响外部。pythondef modify_list(lst): lst.append(100) # 修改原列表 lst [999] # 重新绑定局部变量不影响外部 print(f函数内部 lst: {lst})my_list [1, 2, 3]modify_list(my_list)print(f函数外部 my_list: {my_list}) # 输出 [1, 2, 3, 100]### 4.2 避免意外修改显式复制当需要安全地传递可变对象时使用copy()或deepcopy()pythondef safe_process(data): local_data copy.deepcopy(data) # 深拷贝确保安全 local_data.append(processed) return local_dataoriginal_data [raw]result safe_process(original_data)print(foriginal_data: {original_data}) # 不受影响print(fresult: {result})### 4.3 利用is判断身份相等is运算符判断两个变量是否指向同一对象即 id 相同而判断值是否相等pythona [1, 2, 3]b ac [1, 2, 3]print(a is b) # True同一对象print(a is c) # False不同对象print(a c) # True值相同—## 五、总结通过以上代码示例我们可以总结 Python 变量之间赋值的核心要点1.变量是对象的标签赋值操作只是让变量指向某个对象不会复制对象本身。这是理解一切赋值行为的基础。2.不可变对象“安全”整数、字符串等不可变对象一旦创建不可修改重新赋值会创建新对象因此变量赋值后修改一个变量不会影响另一个。3.可变对象“危险”列表、字典等可变对象的赋值是共享引用通过任一变量修改对象内容都会影响所有指向该对象的变量。这是最常见的陷阱。4.显式复制是解决方案需要独立副本时使用copy.copy()浅拷贝或copy.deepcopy()深拷贝根据嵌套结构选择合适方法。5.函数参数也是赋值函数调用时参数传递本质是赋值操作因此函数内部对可变对象的修改会反映到外部。理解这些机制不仅能避免很多难以调试的 bug还能让你更自信地编写 Python 代码。记住在 Python 中变量不是盒子而是贴在对象上的标签——一个对象可以有多个标签而一个标签只能指向一个对象。
延伸阅读

更多相关文章

2026/9/19 11:17:21

微程序控制器设计全解析:从原理到Verilog实现

1. 项目概述:微程序控制器——计算机的“指挥家”在计算机组成原理这门硬核课程里,微程序控制器(Microprogrammed Control Unit)绝对是一个绕不开的核心概念。它不像CPU的运算器那样直接处理数据,也不像存储器那样存储…

2026/9/20 6:26:21

2026年AI认证证书选择指南:主流认证、报考流程与避坑策略

随着大模型、AIGC和智能体进入办公、产品、运营、研发及企业管理场景,AI认证的种类也在快速增加。不同认证分别侧重通用AI应用、岗位专项能力、云平台技术生态和专业技术发展,名称相似,但学习内容和适用人群并不相同。2026年选择AI认证&#…

2026/9/23 2:30:06

3分钟部署:如何零配置在线编辑专业图表?

3分钟部署:如何零配置在线编辑专业图表? 【免费下载链接】GraphvizOnline Lets Graphviz it online 项目地址: https://gitcode.com/gh_mirrors/gr/GraphvizOnline 你是否厌倦了复杂的桌面工具安装过程?是否希望在浏览器中直接绘制专业…

2026/9/23 13:03:52

3个坑教你用Python生成好听的qq网名女生速查手册

3个坑教你用Python生成好听的qq网名女生速查手册 别再对着屏幕发呆,看了一堆教程还是不会写项目,那是你没抓住核心。今天不聊虚的,直接给你一份基于Python的【好听的qq网名女生】生成器,附带一份实战速查手册。这不是简单的字符拼接,而…

2026/9/23 13:03:52

淘宝评论数据采集实战:从异步接口到风控规避的完整指南

商品详情页的评论区,是很多做电商分析、选品调研、用户口碑监测的人绕不开的一块数据。但真到动手的时候,大部分人会发现:淘宝的评论接口不像普通网页那样直接返回HTML,而是走异步加载,参数里还带着一串加密签名&#…

2026/9/23 13:03:52

ABSODEX直接驱动分度装置调试指南:配线、增益调整与报警定位

简介:CKD公司出品的CKD DD马达自动化系列产品使用说明书,面向自动化设备设计、装配与维护人员,重点讲解ABSODEX AX系列TS型/TH型作动器的选型、安装、调试、维护与保修事项。内容按危险、警告、注意三级安全标识展开,明确了电源接…

2026/9/23 13:03:52

360安全路由器配置实战:从入门到精通的完整示例

360安全路由器配置实战:从入门到精通的完整示例 你是不是也遇到过这种尴尬:背熟了TCP/IP协议,能默写三次握手过程,但真让你给家里那台360安全路由器配个VLAN或者做个端口转发,手就开始抖?很多学员卡在“知道原理”和“动手配置”中间的…

2026/9/23 12:58:52

AI功能测试实战:告别正确性断言,转向上下文边界测试

干了几年功能测试,最怕听到的一句话就是“这个需求有点AI”。一开始我以为跟测普通功能没区别,无非是给输入、比输出、拿结果说话。后来发现,AI系统压根不按我写好的“正确性断言”出门——同一个问题问十次,它给你十个风格不一的…

2026/9/23 12:07:00

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/23 12:06:55

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/23 0:01:54

3个实战技巧搞定形式英语:从看教程到跑通性能优化

3个实战技巧搞定形式英语:从看教程到跑通性能优化 看了一堆教程还是不会写项目?别慌,这种“眼高手低”的困境在开发者圈子里太常见了。很多人以为卡点在语法,其实真正拦路虎是缺乏将知识点串联成完整链路的能力。今天咱们不聊虚的,直接拿【形式英语】这…

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/22 20:01:30

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码