Python中深拷贝和浅拷贝有什么具体的区别吗?

2022-12-19 0 335

复本是Python自学操作过程中很难被忽略,但在工程项目合作开发操作过程李将着关键促进作用的两个基本概念。

有许多合作开发人员虽然忽略这一点儿,即使引致工程项目中再次出现很轻微的BUG。

我以后就即使这种的两个小难题,白白掉洞口了。反反复复功能定位才辨认出居然是由那个难被忽略了的难题引发的….

在这首诗中,他们将看一看怎样在Python中广度和survive复本,研讨Python 怎样处置第一类提及和中的第一类。

浅复本

当他们在 Python 中采用赋值句子 (=) 来建立A43EI235E第一类的复本时,比如,条目或类示例或大体上任何人包涵其它第一类的第一类,Python 并没布季夫第一类这类。

恰好相反,它而已将提及存取到最终目标第一类上。

想像呵呵,他们有两个条目,里头有下列原素。

original_list =[[1,2,3], [4,5,6], [“X”, “Y”, “Z”]]

假如他们试著采用如下表所示的表达式句子来拷贝他们的原初条目。

shallow_copy_list = original_list print(shallow_copy_list)

它可能看起来像他们布季夫了他们的第一类,或许许多同学会认为生成了两个第一类,

[[1,2,3], [4,5,6], [X, Y, Z]]

但,他们真的有两个第一类吗?

不,并没。他们有两个提及变量,指向内存中的同两个第一类。通过打印这两个第一类在内存中的ID,可以很难地验证这一点儿。

id(original_list) # 4517445712 id(shallow_copy_list) # 4517445712

两个更具体内容的证明可以通过试著改变 “两个条目”中的两个值来观察–而实际上,他们改变的是同两个条目,两个指针指向内存中的同两个第一类。

让他们来改变original_list所指向的第一类的最后两个原素。

# Last element of last element original_list[1][1] = “ZZZ” print(original_list)

输出结果是:

[[1, 2, 3], [4, 5, 6], [X, Y, ZZZ]]

两个提及变量都指向同两个第一类,打印shallow_copy_list将返回相同的结果。

print(shallow_copy_list) # [[1, 2, 3], [4, 5, 6], [X, Y, ZZZ]]

浅层拷贝是指拷贝两个第一类的提及并将其存储在两个新的变量中的操作过程。original_list和shallow_copy_list而已指向内存(RAM)中相同地址的提及,这些提及存储了[[1, 2, 3], [4, 5, 6], [X, Y, ZZZ]的值。

Python中深拷贝和浅拷贝有什么具体的区别吗?

他们在拷贝操作过程中,并没生成两个新的第一类,试想呵呵,假如不理解这一点儿,许多同学会误认为它生成了两个完全独立的新第一类,殊不知,在对那个新变量shallow_copy_list进行操作时,原来的变量original_list也会跟随改变。

除了表达式句子之外,还可以通过Python标准库的复本模块实现浅复本

要采用复本模块,他们必须首先导入它。

import copy second_shallow_copy_list = copy.copy(original_list)

把它们都打印出来,看一看它们是否提及了相同的值。

print(original_list) print(second_shallow_copy_list)

不出所料,确实如此,

[[1, 2, 3], [4, 5, 6], [X, Y, ZZZ]] [[1, 2, 3], [4, 5, 6], [X, Y, ZZZ]]

通常,你想拷贝两个A43EI235E第一类,比如在两个方法的开始,然后修改布季夫的第一类,但保持原初第一类的原样,以便以后再采用它。

为了达到那个目的,他们需要对该第一类进行深度拷贝。现在让他们来自学呵呵甚么是广度复本以及怎样广度复本两个A43EI235E第一类。

深复本

广度拷贝两个第一类意味着真正地将该第一类和它的值布季夫到内存中的两个新的复本(示例)中,并具有这些相同的值。

通过广度复本,他们实际上可以建立两个独立于原初数据的新第一类,但包涵相同的值,而不是为相同的值建立新的提及。

在两个典型的广度复本操作过程中,首先,两个新的第一类提及被建立,然后所有的子第一类被递归地加入到父第一类中。

这种一来,与浅层复本不同,对原初第一类的任何人修改都不会反映在复本第一类中(反之亦然)。

下面是两个典型的广度复本的简单图示。

Python中深拷贝和浅拷贝有什么具体的区别吗?

要在 Python 中广度复本两个第一类,他们采用 copy 模块的 deepcopy()方法。

让我们导入 copy 模块并建立两个条目的广度复本。

import copy original_list = [[1,2,3], [4,5,6], [“X”, “Y”, “Z”]] deepcopy_list = copy.deepcopy(original_list)

现在让他们打印他们的条目,以确保输出是相同的,以及他们的ID是唯一的。

print(id(original_list), original_list) print(id(deepcopy_list), deepcopy_list)

输出结果证实,他们已经为自己建立了两个真正的复本。

4517599280, [[1, 2, 3], [4, 5, 6], [X, Y, Z]] 4517599424, [[1, 2, 3], [4, 5, 6], [X, Y, Z]]

现在让他们试着修改他们的原初条目,把最后两个条目的最后两个原素改为 “O”,然后打印出来看一看结果。

original_list[1][1] = “O” print(original_list)

他们得到了预期的结果。

[[1, 2, 3], [4, 5, 6], [X, Y, O]]

现在,假如他们继续前进并试著打印他们的复本条目,以后的修改并没影响新的变量

print(deepcopy_list) # [[1, 2, 3], [4, 5, 6], [X, Y, Z]]

记住,copy()和deepcopy()方法适用于其它A43EI235E第一类。这意味着,你也可以用它们来建立类示例的复本。

结语

在这首诗中,他们自学了浅层复本和深层复本第一类的含义。

他们还了解到,他们可以采用copy模块的copy()方法来建立两个浅层复本,并采用deepcopy()方法来建立A43EI235E第一类的深层拷贝。

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务