理解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 动态变化所影响!

相关推荐
阿斯卡码1 小时前
jupyter添加、删除、查看内核
ide·python·jupyter
埃菲尔铁塔_CV算法4 小时前
图像算法之 OCR 识别算法:原理与应用场景
图像处理·python·计算机视觉
封步宇AIGC4 小时前
量化交易系统开发-实时行情自动化交易-3.4.2.Okex行情交易数据
人工智能·python·机器学习·数据挖掘
封步宇AIGC4 小时前
量化交易系统开发-实时行情自动化交易-2.技术栈
人工智能·python·机器学习·数据挖掘
love_and_hope5 小时前
Pytorch学习--神经网络--完整的模型训练套路
人工智能·pytorch·python·深度学习·神经网络·学习
在人间负债^6 小时前
基于标签相关性的多标签学习
人工智能·python·chatgpt·大模型·图像类型
清酒伴风(面试准备中......)7 小时前
Java集合 List——针对实习面试
java·面试·list·实习
python1567 小时前
使用YOLOv9进行图像与视频检测
开发语言·python·音视频
狂奔solar7 小时前
DQN强化训练agent玩是男人就下xx层小游戏
python·pygame·dqn 强化
互联网杂货铺7 小时前
软件测试之白盒测试(超详细总结)
自动化测试·软件测试·python·测试工具·职场和发展·单元测试·测试用例