当我们想复制两个一模一样的列表时,我们可能使用到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方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
关键词:
上一篇:世界报道:C# DataGridView行列转换的具体实现
下一篇:最后一页
X 关闭
X 关闭
- 15G资费不大降!三大运营商谁提供的5G网速最快?中国信通院给出答案
- 2联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 3亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 4现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 5如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 6AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 7转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 8充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 9好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 10名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?