python列表复制的差异_python3之深浅copy对比

一、赋值对比

1、列表

l1 = [1,2,3]

l2 = l1

l1.append('a')

print(l1,l2)               #[1, 2, 3, 'a'] [1, 2, 3, 'a']

print(id(l1),id(l2))          #43499848 43499848

#可以看到两个列表的值以及id值相同,对应的是同一个内存地址

2、字典

dic = {'name':'barry'}

dic1 = dic

dic['age'] = 18

print(dic,dic1)            #{'name': 'barry', 'age': 18} {'name': 'barry', 'age': 18}

print(id(dic),id(dic1))       #31157344 31157344

#可以看到两个字典的值以及id值相同,对应的是同一个内存地址

3、字符串

s = 'alex'

s1 = s

s2 = s.replace('a','A')

print(s,s1,s2)                  #alex alex Alex

print(id(s),id(s1),id(s2))           #31040208 31040208 31040376

#赋值是同一个内存地址,替换字符串后的变量s2是另外的地址

二、深浅copy

1、浅copy

对于浅copy来说,第一层创建的是新的内存地址。而从第二层开始,指向的是同一个内存地址,所有,对于第二层以及更深的层数来说,保持一致性。

# 1、普通浅copy

l1 = [1,2,3,4]

l2 = l1.copy()

l1.append('a')

print(l1,l2)                     #[1, 2, 3, 4, 'a'] [1, 2, 3, 4]

print(id(l1),id(l2))             #37077320 37078664

#id内存地址不一样,创建了两个地址空间,一个改变,另一个不会变化

# 2、嵌套浅copy

l1 = [1,[22,33,44],3,4,]

l2 = l1.copy()

l1[1].append('a')

print(l1,id(l1),l2,id(l2))       #[1, [22, 33, 44, 'a'], 3, 4]  [1, [22, 33, 44, 'a'], 3, 4]

print(id(l1),id(l2))              #43173512 43173256

print(id(l1[1]),id(l2[1]))       #43172168 43172168

# 第一层都是独立的的。从第二层开始都是是公用的,改一个都会变。

l1 = [1,[22,33,44],3,4,]

l2 = l1.copy()

l1[0] = 111

print(l1,l2)                     #[111, [22, 33, 44], 3, 4] [1, [22, 33, 44], 3, 4]

print(id(l1),id(l2))             #43370120 43369864

# 可以看到第一层都是独立的,改一个不影响另一个的结果

2、 深copy.deepcopy()

对于深copy来说,两个是完全独立的,改变任意一个的元素(无论是多少层),另一个绝不会改变。

import copy

l1 = [1,[22,33,44],3,4,]

l2 = copy.deepcopy(l1)

# 改变第一层

l1[0] = 111

print(l1,l2)                    #[111, [22, 33, 44], 3, 4] [1, [22, 33, 44], 3, 4]

print(id(l1),id(l2))            #43238536 43239048

# 改变第二层

l1[1].append('a')

print(l1,l2)                   # [111, [22, 33, 44, 'a'], 3, 4] [1, [22, 33, 44], 3, 4]

print(id(l1),id(l2))           #43238536 43239048

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值