关于python列表的深浅拷贝问题

本文探讨Python列表的深浅拷贝差异。浅拷贝仅复制列表第一层元素的地址,一维列表拷贝后原列表变化不影响新列表,但二维列表中内层列表的修改会影响新列表。深拷贝则复制所有内层元素的地址,确保原列表变化不会影响新列表。

关于python列表的深浅拷贝问题

拷贝需要用到内置的copy模块

import copy

浅拷贝:

引用赋值,list.copy(),copy.cpoy(list)

  • 一维列表
 l1 = [1, 2, 3, 4]
  l2 = l1.copy()
  l3 = l1
  l4 = copy.copy(l1)
  print(l1, l2, l3, l4, sep='\n')
  '''
  结果为:
  l1--->[1, 2, 3, 4]
  l2--->[1, 2, 3, 4]
  l3--->[1, 2, 3, 4]
  l4--->[1, 2, 3, 4]
  '''
  # 现在修改l1
  l1[1] = 9
  print(l1, l2, l3, l4, sep='\n')
  '''
  结果为:
  l1--->[1, 9, 3, 4]
  l2--->[1, 2, 3, 4]
  l3--->[1, 9, 3, 4]
  l4--->[1, 2, 3, 4]
  '''
  l1.append(99)
  print(l1, l2, l3, l4, sep='\n')
  '''
  结果为:
  l1--->[1, 9, 3, 4, 99]
  l2--->[1, 2, 3, 4]
  l3--->[1, 9, 3, 4, 99]
  l4--->[1, 2, 3, 4]
  '''

其中引用赋值是两个变量都指向同一个列表,可以理解为是一种拷贝,但是引用赋值都会随着原列表变化而变化
一维列表浅拷贝原列表变化(增删改),新列表不会改变,引用赋值除外

  • 二维列表
l1 = [1, 2, [5, 6], 3, 4]
  l2 = l1.copy()
  l3 = l1
  l4 = copy.copy(l1)
  print(l1, l2, l3, l4, sep='\n')
  '''
  结果为:
  l1--->[1, 2, [5, 6], 3, 4]
  l2--->[1, 2, [5, 6], 3, 4]
  l3--->[1, 2, [5, 6], 3, 4]
  l4--->[1, 2, [5, 6], 3, 4]
  '''
  # 现在修改l1中的内层嵌套列表
  l1[2].append(7)
  print(l1, l2, l3, l4, sep='\n')
  '''
  结果为:
  l1--->[1, 2, [5, 6, 7], 3, 4]
  l2--->[1, 2, [5, 6, 7], 3, 4]
  l3--->[1, 2, [5, 6, 7], 3, 4]
  l4--->[1, 2, [5, 6, 7], 3, 4]
  '''
  # 修改l1的外层元素
  l1.append(99)
  print(l1, l2, l3, l4, sep='\n')
  '''
  结果为:
  l1--->[1, 2, [5, 6, 7], 3, 4, 99]
  l2--->[1, 2, [5, 6, 7], 3, 4]
  l3--->[1, 2, [5, 6, 7], 3, 4, 99]
  l4--->[1, 2, [5, 6, 7], 3, 4]
  '''

二维列表浅拷贝原列表变化(增删改),修改外层元素时新列表不会改变,但是修改内层嵌套的列表时,新列表会跟着改变,引用赋值会一直跟着变
原因是浅拷贝只拷贝了列表第一层元素的地址,对于内层小列表来说,只拷贝了小列表的容器地址,内在的元素并没有拷贝,所以在小列表中添加元素,小列表(容器)本身的地址并没有变化,只是里面装的东西变了

深拷贝:

 list2 = copy.deepcopy(list1)
  • 一维列表
l1 = [1, 2, 3, 4]
  l2 = copy.deepcopy(l1)
  print(l1, l2, sep='\n')
  '''
  结果为:
  l1--->[1, 2, 3, 4]
  l2--->[1, 2, 3, 4]
  '''
  
  # 修改l1的外层元素
  l1.append(99)
  print(l1, l2, sep='\n')
  '''
  结果为:
  l1--->[1, 2, 3, 4, 99]
  l2--->[1, 2, 3, 4]
  '''

一维列表深拷贝与浅拷贝一样,原列表变化新列表不会变

  • 二维列表
l1 = [1, 2, [5, 6], 3, 4]
  l2 = copy.deepcopy(l1)
  print(l1, l2, sep='\n')
  '''
  结果为:
  l1--->[1, 2, [5, 6], 3, 4]
  l2--->[1, 2, [5, 6], 3, 4]
  '''
  # 现在修改l1中的内层嵌套列表
  l1[2].append(7)
  print(l1, l2, sep='\n')
  '''
  结果为:
  l1--->[1, 2, [5, 6, 7], 3, 4]
  l2--->[1, 2, [5, 6], 3, 4]
  '''
  # 修改l1的外层元素
  l1.append(99)
  print(l1, l2, sep='\n')
  '''
  结果为:
  l1--->[1, 2, [5, 6, 7], 3, 4, 99]
  l2--->[1, 2, [5, 6], 3, 4]
  '''

二维列表深拷贝,原列表改变,新列表都不改变,因为深拷贝是将列表内所有最内层的元素的地址都拷贝下来,相当于把容器里面装的东西都复制了一份,再给原来的容器添加东西,复制出来的容器不会受影响,两者之间已经没有关系了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值