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

相关推荐
IT小盘6 小时前
03-大模型API不只是发送Prompt-流式输出超时重试与异常处理
人工智能·python·prompt
Zzz不能停8 小时前
个人博客系统系统---测试报告【笔耕云】
python·功能测试·自动化·压力测试
互联网中的一颗神经元8 小时前
小白python入门 - 39. 采集流水线小项目
开发语言·python
郭老二9 小时前
【Python】常用模块:xmlrpc
python
名字还没想好☜10 小时前
Python itertools 实战:用 groupby、chain、islice 优雅处理大数据流
linux·windows·python·迭代器·itertools
威联通网络存储10 小时前
TS-h2490FU在面板制造Array段AOI缺陷画廊中的并联
python·制造
接针11 小时前
UV 常用命令
python·uv
无垠的广袤12 小时前
【工业树莓派 CM0 Dev Board】扩展板设计
linux·python·嵌入式硬件·pcb设计·模块化·传感器
Yolanda_202213 小时前
在vscode终端中可使用pip,但是cmd终端中找不到命令 pip问题的解决
vscode·python·conda·pip
2301_7644413313 小时前
用动力学系统(微分方程)为 Kernberg 的客体关系单元提供数学化的操作定义,把“自体—客体“这对心理结构建模成一个二维耦合系统
数据结构·python·算法·数学建模