理解Python中的变量赋值与列表list引用 | 深拷贝

最近在改baseline的代码,发现一个以前不知道的python知识(我的python基础还是太差了!)。

场景重现

list1 = 1, 2, 3

list2 = list1
这时候无论修改 list1 还是 list2 ,另一个 list 变量内容也会被改变!

python 复制代码
#####输入
def function(list0):
    list10 = list0
    list10.append(2)
    print(f"list0 = {list0}")
    
if __name__ == '__main__':
    list3 = list1
    temp = len(list1)
    list3.append(19)
    list1.extend(list2)
    function(list1)
    print(f"list3 = {list3}")
    print(f"temp = {temp}")
    print(f"len(list1) = {len(list1)}")


#####输出
list0 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 19, 10, 11, 2]
list3 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 19, 10, 11, 2]
temp = 9
len(list1) = 13

在上面的代码中,无论是append操作还是extend操作,亦或是调用函数都对改变另外一个列表变量的内容!

这种情况是因为在 Python 中,赋值操作实际上是将对象的引用从一个变量传递到另一个变量。当你执行 list3 = list1 时,list3 实际上引用了和 list1 相同的列表对象。因此,当你修改 list1 时,list3 也会发生相应的变化,反之亦然。

所以说,当你将一个列表赋值给另一个变量时,实际上是将对列表的引用复制给了新变量,而不是复制列表本身。这种行为称为浅拷贝

避免问题的方法

如果你想要避免这种情况,你可以使用深拷贝来创建列表的副本。深拷贝会创建一个新的对象,其中包含原始列表中所有元素的副本。你可以通过 copy 模块中的 deepcopy 函数来实现深拷贝

python 复制代码
#####输入
from copy import deepcopy

list1 = [1,2,3,4,5,6,7,8,9]
list2 = [10,11]

def function(list0):
    list10 = list0
    list10.append(2)
    print(f"list0 = {list0}")

if __name__ == '__main__':
    list3 = deepcopy(list1)
    temp = len(list1)
    list3.append(19)
    print(f"list1 = {list1}")
    list1.extend(list2)
    function(list1)
    print(f"list3 = {list3}")
    print(f"temp = {temp}")
    print(f"len(list1) = {len(list1)}")


#####输出
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
list0 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 2]
list3 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 19]
temp = 9
len(list1) = 12

需要注意的是,像temp = len(list1)这样的语句不会受到影响,因为它只取决于当时的 len(list1) 值,不受 list1 动态变化所影响!

相关推荐
hhzz8 分钟前
基于监控视频的水位尺自动识别技术方案与实现
python·opencv·yolo·图像识别·cv
yongche_shi15 分钟前
ragas官方文档中文版(五十)
开发语言·python·ai·ragas·如何评估和改进 rag 应用
AI行业学习2 小时前
Notepad++ 官方下载 + 完整安装 + 全套优化配置(2026最新)
开发语言·人工智能·python·前端框架·html·notepad++
大圣编程2 小时前
Python中continue语句的用法是什么?
开发语言·前端·python
云烟成雨TD3 小时前
LangFlow 1.x 系列【5】可视化编辑页面功能说明
人工智能·python·agent
geovindu4 小时前
python: Functional Options Pattern
开发语言·后端·python·设计模式·惯用法模式·函数式选项模式
tryCbest5 小时前
Python 文件操作
服务器·python
涛声依旧-底层原理研究所5 小时前
Agent 长任务可靠性设计:实现暂停、恢复、续跑与崩溃重启的完整方案
人工智能·python·系统架构
AC赳赳老秦5 小时前
防火墙规则批量配置实战:OpenClaw 自动生成模板、批量下发与合规性校验全解析
java·开发语言·人工智能·python·github·php·openclaw
小小编程路5 小时前
如何优化while循环的性能?
python