900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > Python中深浅拷贝的案例教程

Python中深浅拷贝的案例教程

时间:2021-10-21 06:02:09

相关推荐

Python中深浅拷贝的案例教程

在本节中,您将通过运行Python中的浅拷贝和深拷贝实例来理解copy模块创造副本的不同。

在Python中复制对象

在Python中,我们使用=运算符来创建对象的副本。您可能会认为这会创建一个新对象。没有。它仅创建一个共享原始对象引用的新变量。

让我们举个例子,我们创建一个名为 old_list 并将对象引用传递给 new_list使用=运算符。

示例1:使用=运算符进行复制

#Copy using = operatorold_list = [[1, 2, 3], [4, 5, 6], [7, 8, 'a']]new_list = old_listnew_list[2][2] = 9print('Old List:', old_list)print('ID of Old List:', id(old_list))print('New List:', new_list)print('ID of New List:', id(new_list))

从输出中可以看到两个变量 old_list 和 new_list共享相同的ID,即140673303268168。

因此,如果您要修改 new_list 要么 old_list,更改在两者中均可见。

本质上,有时您可能希望保持原始值不变,而仅修改新值,反之亦然。在Python中,有两种创建副本的方法:

浅拷贝深拷贝

为了使这些复制生效,我们使用了copy模块。

复制模块(copy module)

我们将copyPython模块用于浅层和深层复制操作。假设您需要复制化合物列表说X。例如:

import copycopy.copy(x)copy.deepcopy(x)

在这里,copy()返回浅拷贝副本x。同样,deepcopy()返回的深拷贝副本x。

浅拷贝

浅拷贝副本会创建一个新对象,该对象存储原始元素的引用。

因此,浅拷贝副本不会创建嵌套对象的副本,而是仅复制嵌套对象的引用。这意味着复制过程本身不会递归或创建嵌套对象的副本。

示例2:使用浅拷贝副本创建副本

import copyold_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]new_list = copy.copy(old_list)print("Old list:", old_list)print("New list:", new_list)

在上面的程序中,我们创建了一个嵌套列表,然后使用copy()方法对其进行浅拷贝复制。

这意味着它将创建具有相同内容的新的独立对象。为了验证这一点,我们同时打印两个old_listnew_list

确认new_list与…不同old_list,我们尝试将新的嵌套对象添加到原始对象并进行检查。

示例3:使用浅拷贝复制将[4,4,4]添加到old_list

'''学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:725638078寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!'''import copyold_list = [[1, 1, 1], [2, 2, 2], [3, 3, 3]]new_list = copy.copy(old_list)old_list.append([4, 4, 4])print("Old list:", old_list)print("New list:", new_list)

在上面的程序中,我们创建了的浅拷贝副本old_list。的new_list包含对存储在其中的原始嵌套对象的引用old_list。然后,我们添加新的列表即[4, 4, 4]到old_list。此新子列表未复制到new_list

但是,当您在其中更改任何嵌套对象时old_list,更改出现在new_list

示例4:使用浅拷贝添加新的嵌套对象

import copyold_list = [[1, 1, 1], [2, 2, 2], [3, 3, 3]]new_list = copy.copy(old_list)old_list[1][1] = 'AA'print("Old list:", old_list)print("New list:", new_list)

在以上程序中,我们对old_listold_list[1][1] = 'AA'。的两个子列表old_listnew_list索引处[1][1]已修改。这是因为两个列表共享相同嵌套对象的引用。

深拷贝

深层副本将创建一个新对象,并以递归方式添加原始元素中存在的嵌套对象的副本。

让我们继续示例2。但是,我们将使用模块中提供的deepcopy()功能来创建深层副本copy。深层副本创建原始对象及其所有嵌套对象的独立副本。

示例5:使用deepcopy()复制列表

'''学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:725638078寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!'''import copyold_list = [[1, 1, 1], [2, 2, 2], [3, 3, 3]]new_list = copy.deepcopy(old_list)print("Old list:", old_list)print("New list:", new_list)

在上面的程序中,我们使用deepcopy()函数来创建外观相似的副本。

但是,如果您更改原始对象中的任何嵌套对象old_list,您将看不到副本的任何更改new_list

示例6:使用深拷贝在列表中添加新的嵌套对象

import copyold_list = [[1, 1, 1], [2, 2, 2], [3, 3, 3]]new_list = copy.deepcopy(old_list)old_list[1][0] = 'BB'print("Old list:", old_list)print("New list:", new_list)

在上面的程序中,当我们将新值分配给old_list,我们只能看到old_list被修改。这意味着old_listnew_list是独立的。这是因为old_list是递归复制的,这对于它的所有嵌套对象都是如此。

结尾给大家推荐一个非常好的学习教程,希望对你学习Python有帮助!

Python基础入门教程推荐

Python爬虫案例教程推荐

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。