python中list.copy方法用法详解

 更新时间:2023年02月07日 15:53:18   作者:不愿透露姓名的余菜鸟  
这篇文章主要给大家介绍了关于python中list.copy方法使用的相关资料,文中还介绍了python list.copy() 和 copy.deepcopy()区别,需要的朋友可以参考下

当我们想复制两个一模一样的列表时,我们可能使用到list.copy()这个方法,这个方法可以让我们复制一个相同的数组,当遇到下面这种情况时,可能会遇到一些问题

# _*_coding='utf8'_*_
nameList = [1, 2, 3, 4, 5]
nameList1 = nameList.copy()
nameList[1] = 55
print(nameList, nameList1)

此时打印出nameList和nameList1时,两个列表的元素是下面这样

[1, 55, 3, 4, 5] [1, 2, 3, 4, 5]

可以看到列表的第二个元素不一样

这是因为在python中list.copy()这个函数在执行的时候,指向的不是nameList在内存中的地址,而是重新复制了一份,此时两个列表在内存中的地址不同,我们可以打印出来看看

使用如下代码可以见到,两个列表的内存已经有差别了

nameList = [1, 2, 3, [3, 4, 5], 4, 5]
nameList1 = nameList.copy()
nameList[1] = 55
print(id(nameList), id(nameList1))

2207528867520 2207531826048

此时修改的nameList[1] = 55并不会在nameList1中生效

而当nameList中又存在数组时,情况又会发生变化

# _*_coding='utf8'_*_
nameList = [1, 2, 3, [3, 4, 5], 4, 5]
nameList1 = nameList.copy()
nameList[3][2] = 55
print(nameList, nameList1)

输入如下内容

[1, 2, 3, [3, 4, 55], 4, 5] [1, 2, 3, [3, 4, 55], 4, 5]

可以看到两个list中嵌套的数组都发生了变化,这是因为在列表中存放的二维列表,实际上存放的是二维列表在内存中的地址,当修改其中一个列表,另外一个自然也会受到影响,那么,让我们来验证一下是不是存放的内存地址。

同样的,我们使用id()这个方法来取出内存地址

# _*_coding='utf8'_*_
nameList = [1, 2, 3, [3, 4, 5], 4, 5]
nameList1 = nameList.copy()
nameList[3][2] = 55
print(id(nameList[3]), id(nameList1[3]))

输出如下内容

2879859422336 2879859422336

可以看到,两个内存地址是相同的

copy方法介绍到此结束

补充:python list.copy() 和 copy.deepcopy()区别

举个例子

import copy
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None
    def __repr__(self):
        return str(self.val)
list1 = [ListNode(1), ListNode(2)]
list2 = list1.copy()
list3 = list1[:]
list4 = copy.deepcopy(list1)
print(list1, list2, list3, list4)
# [1, 2] [1, 2] [1, 2] [1, 2]
list1[0].val = 5
print(list1, list2, list3, list4)
# [5, 2] [5, 2] [5, 2] [1, 2]
list1.append(ListNode(10))
print(list1, list2, list3, list4)
# [5, 2, 10] [5, 2] [5, 2] [1, 2]
print(id(list1[0]),id(list2[0]),id(list3[0]),id(list4[0]))
# 1984073709792 1984073709792 1984073709792 1984073707824

解释

  • list1 是原数组
  • list2 和 list3 都是list1的浅拷贝,浅拷贝到底是什么意思?

python的list里面存的都是引用,如果存的是listnode,实际上存的是listnode的引用,也就是地址,毕竟如果listnode里存了很多关于这个node的信息的话,直接在list里面存这段信息的地址就很方便,等到要用这段信息的时候(比如list1[0].val),只要找到地址(list1[0])再到这段地址取值(.val)就可以了。

浅拷贝的意思是,开辟一段内存,这段内存里复制了原list的地址。

地址还是那个地址,所以可以看出**id(list1[0]),id(list2[0])**是完全一样的。这会带来的问题是,当我们把这段地址里的值.val变化一下(list1[0].val = 5), 浅拷贝的数组里对应元素的值也就跟着变了

深拷贝就厉害了,不光把原数组存的地址拷贝了,就连原数组地址里对应的数据也都进行了复制,所以可以看到**id(list1[0]),id(list4[0])**变得不一样了

总结

到此这篇关于python中list.copy方法用法的文章就介绍到这了,更多相关python list.copy方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • django中的*args 与 **kwargs使用介绍

    django中的*args 与 **kwargs使用介绍

    这篇文章主要介绍了django中的*args 与 **kwargs使用介绍,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • 详解用Python处理Args的3种方法

    详解用Python处理Args的3种方法

    这篇文章主要介绍了用Python处理Args的3种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Django+Vue实现文件上传下载的项目实践

    Django+Vue实现文件上传下载的项目实践

    本文主要介绍了Django+Vue实现文件上传下载的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • 使用python实现省市三级菜单效果

    使用python实现省市三级菜单效果

    本文给大家分享的是使用使用python实现省市三级菜单效果的代码,非常的实用,有需要的小伙伴可以参考下。
    2016-01-01
  • Python优先队列实现方法示例

    Python优先队列实现方法示例

    这篇文章主要介绍了Python优先队列实现方法,结合实例形式分析了Python优先队列的具体定义与使用方法,具有一定参考借鉴价值,需要的朋友可以参考下
    2017-09-09
  • python去除列表中的空值元素实战技巧

    python去除列表中的空值元素实战技巧

    这篇文章主要介绍了python实战技巧之去除列表中的空值元素,搜集针对python高效处理数据的核心代码,今天是实现去除列表中的空值元素,需要的朋友可以参考下
    2023-02-02
  • 将python代码打包成.exe文件直接运行的具体步骤

    将python代码打包成.exe文件直接运行的具体步骤

    小编最近收到了一个小伙伴的问题,就是那么多有趣的代码,怎么发给别人,让没有python环境的小伙伴也可以使用呢,本文小编将带着大家探索如何将自己的python代码打包成.exe可执行文件,一起来看看吧
    2024-02-02
  • Django 设置admin后台表和App(应用)为中文名的操作方法

    Django 设置admin后台表和App(应用)为中文名的操作方法

    这篇文章主要介绍了Django 设置admin后台表和App(应用)为中文名的操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • Python threading Local()函数用法案例详解

    Python threading Local()函数用法案例详解

    这篇文章主要介绍了Python threading Local()函数用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • Django 拼接两个queryset 或是两个不可以相加的对象实例

    Django 拼接两个queryset 或是两个不可以相加的对象实例

    这篇文章主要介绍了Django 拼接两个queryset 或是两个不可以相加的对象实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03

最新评论