广告位联系
返回顶部
分享到

python中list.copy的用法介绍

python 来源:互联网 作者:佚名 发布时间:2023-07-17 21:42:59 人浏览
摘要

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

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

1

2

3

4

5

# _*_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在内存中的地址,而是重新复制了一份,此时两个列表在内存中的地址不同,我们可以打印出来看看

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

1

2

3

4

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中又存在数组时,情况又会发生变化

1

2

3

4

5

# _*_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()这个方法来取出内存地址

1

2

3

4

5

# _*_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()区别

举个例子

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

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])**变得不一样了


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • Python利用百度地图API实现步行导航功能的方法
    百度地图作为一款流行的地图应用程序,不仅提供了地图浏览功能,也提供了丰富的API供开发者使用。本文将通过Python编程,利用百度地图
  • python中list.copy的用法介绍
    当我们想复制两个一模一样的列表时,我们可能使用到list.copy()这个方法,这个方法可以让我们复制一个相同的数组,当遇到下面这种情况时
  • 彻底解决python NameError:name

    彻底解决python NameError:name '__file__' is not defined的方
    问题背景 我创建了一个函数,里面包含了一个获取当前执行文件路径的代码 1 current_path = os.path.dirname(os.path.abspath(__file__)) 我把这段代码放在
  • 使用python实现md5加密的方法
    1、简介 Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用于确保信息传输完整一致。
  • Python代码模拟CPU工作原理的介绍
    理解 CPU 工作原理,重要的是理解 pc 不停地自增地址,顺序执行程序指令。当遇到跳转指令时,会将 pc 重置为新地址。在顺序执行程序指令
  • python实现数组平移K位问题介绍
    python数组平移K位 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 def move(ls: list, offset): 元素原索引+位移数
  • Python利用wxPython实现长文本处理
    在文本编辑器和IDE等应用程序中,可以使用这个示例代码来处理长文本,以便用户更好地查看和编辑文本。 在数据分析和科学计算等领域中
  • Python爬虫之解析HTML页面
    用Python解析HTML页面 在网络爬取的过程中,我们通常需要对所爬取的页面进行解析,从中提取我们需要的数据。网页的结构通常是由 HTML 标签
  • 已解决不小心卸载pip后怎么处理(重新安装pip的两
    已解决:不小心卸载pip后(手动安装pip的两种方式) 报错问题 一个粉丝群的小伙伴提出的问题,不小心卸载了pip怎么重新安装呢?(当时他
  • Python基于Google Bard实现交互式聊天机器人

    Python基于Google Bard实现交互式聊天机器人
    现在我们想实现自动化,所以我用Python做一个交互式的聊天机器人。 获取Session ID 通过浏览器先拿到SessionID,它是一个cookie,名为__Secure-1
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计