尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Python 中可变对象的“引用赋值”特性——可变对象的“引用传递”

Python 中可变对象的“引用赋值”特性——可变对象的“引用传递”
📅 发布时间:2026/6/19 23:12:20

一、踩坑代码

某程序老鸟讲了一个故事:
“2019年夏天,我在做一个推荐系统的用户画像模块。当时写了这样的代码:

# 当时的蠢代码,现在想起来都脸红
default_preferences = []  # 想着所有用户共享一个默认偏好
users = {}
for user_id in user_ids:users[user_id] = default_preferences  # 妈的,大坑!
```python所有用户共享了同一个列表!用户A喜欢看动作片,结果用户B、C、D全都变成动作片爱好者了。线上故障持续了2个小时,被领导骂得狗血淋头。那天晚上我查了一夜的资料,才彻底搞懂Python的对象模型。”解释一下:
```python
# 1. 创建一个列表(内存地址假设为 0x123)
default_preferences = []  
# 2. 循环给 3 个用户赋值
user_ids = [1,2,3]
users = {}
for user_id in user_ids:users[user_id] = default_preferences  # 所有用户都指向 0x123 的列表# 3. 给用户1添加“动作片”偏好
users[1].append("动作片")  # 4. 查看所有用户的偏好——全变成了动作片!
print(users[1])  # ['动作片'](改的是 0x123 的列表)
print(users[2])  # ['动作片'](指向同一个 0x123)
print(users[3])  # ['动作片'](同样指向 0x123)

本质是:以为给每个用户“分配了一个新列表”,实际是“让所有用户共用同一个列表”——这就是线上故障的根源:用户A修改偏好,等于修改了所有人的偏好。

二、怎么改才对?(避免共享可变对象)

核心思路:给每个用户创建“独立的新列表”,而不是复用同一个列表的引用。有两种常见写法:

1. 循环内每次创建新列表(推荐)

在循环里直接定义空列表,每个用户拿到的都是内存中不同的新列表:

users = {}
for user_id in user_ids:# 每次循环都新建一个空列表(内存地址不同)users[user_id] = []  # 给用户1加偏好,只影响用户1
users[1].append("动作片")
print(users[1])  # ['动作片']
print(users[2])  # [](独立列表,不受影响)

2. 用列表的 copy() 方法(适合有默认值的场景)

如果默认偏好不是空列表(比如有默认值 ["喜剧片"]),可以用 copy() 复制一个新列表给每个用户:

# 有默认值的列表
default_preferences = ["喜剧片"]  
users = {}
for user_id in user_ids:# 复制一个新列表(内存地址不同),避免共享users[user_id] = default_preferences.copy()  # 给用户1加动作片,不影响其他人
users[1].append("动作片")
print(users[1])  # ['喜剧片', '动作片']
print(users[2])  # ['喜剧片'](默认值,未被修改)

三、为什么这个“坑”很容易踩?(新手常见误区)

很多人会误以为“赋值就是复制数据”,但忽略了“可变对象 vs 不可变对象”的区别:

  • 比如给整数赋值 a = 1; b = a; b = 2,a 还是 1(不可变对象,赋值是副本);
  • 但给列表赋值 a = []; b = a; b.append(1),a 也会变成 [1](可变对象,赋值是引用)。

你的场景里,“想让所有用户有默认偏好”是合理需求,但错把“共享引用”当成了“共享默认值”——最终导致数据串用,线上故障。

总结

这段代码的“蠢”不是逻辑错,而是对 Python 可变对象的赋值机制理解不到位:

  • 可变对象(列表、字典等)赋值传递“引用”,不是“副本”;
  • 循环中给多个变量赋值同一个可变对象,会导致所有变量共享数据;
  • 解决办法:给每个用户创建独立的可变对象(循环内新建,或用 copy() 复制)。

这种坑很典型,很多新手(甚至工作几年的开发者)都踩过——吃一次线上故障的亏,对“引用传递”的理解就再也忘不掉了~

相关新闻

  • Modbus协议分类及测试学习笔记
  • 习题-极大原理
  • 极大原理

最新新闻

  • 2026昆山防水补漏服务商适配指南:昆山鼎壹万防水补漏公司及本地优质服务商深度解析 专业防水公司排名推荐(2026年6月防水补漏最新TOP权威排名) - 鼎壹万修缮说
  • 打造你的“开发战斗机”:VS Code 扩展推荐指南(从入门到入土版)
  • NSK高速精密滚珠丝杠PSS1520技术详述
  • 深圳家电维修平台推荐:本地实测较好的几家服务商深度对比——2026年6月最新发布 - 一步到家
  • 2026苏州防水服务商适配指南:昆山鼎壹万防水补漏公司与区域品牌实力深度解析 专业防水公司排名推荐(2026年6月防水补漏最新TOP权威排名) - 鼎壹万修缮说
  • Headroom:让 AI Agent「吃得少、营养好」的开源上下文压缩神器

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号