python复制地址不同有问题_Python - 深浅复制的区别

Python中的数据类型是否可变分类依据是你修改这个变量的时候修改的是内存指针还是内存地址里的值。

不可变数据类型修改变量的值时,实际上只是修改了这个变量的指针。而可变数据类型的变量则是内存地址不变,修改了该地址的值。

在可变数据类型的使用与复制时要额外注意这点。

>>> numbs1 = [100, 200, 300]

>>> numbs2 = numbs1

>>> numbs1[0] = 1

>>> print(numbs2)

[1, 200, 300]

>>> id(numbs1)

140071119138240

>>> id(numbs2)

140071119138240

深浅复制的区别主要应用于可变数据类型里的列表、字典、集合。

浅复制在复制的时候新的对象指向的内存地址与原对象不同,但是对象内的元素指向的内存地址是相同的。

>>> numbs1 = [100, 200, 300]

>>> numbs2 = numbs1

>>> numbs1[0] = 1

>>> print("%X %X" %(id(numbs2),id(numbs2)))

7F465477ED00 7F465477ED00

>>> numbs3 = numbs1.copy

>>> print("列表的内存地址%X %X %X" %(id(numbs1),id(numbs2),id(numbs3)))

列表的内存地址7FAB8520E180 7FAB8520E180 7FAB8520E380

>>> print("列表中第一个元素的内存地址%X %X %X" %(id(numbs1[0]),id(numbs2[0]),id(numbs3[0])))

列表中第一个元素的内存地址558984E25D40 558984E25D40 558984E25D40

而深复制则会将对象内的元素也完全复制到其他地址上。是一种完全拷贝。# import copy ; z = copy.deepcopy(x)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,深复制和浅复制是两种不同复制方式。 浅复制是创建一个新对象,这个对象有着原始对象的引用,但是它并不复制原始对象的数据。在Python中,使用copy()方法可以实现浅复制。 深复制是创建一个新对象,这个对象有着原始对象数据的完整复制。在Python中,使用deepcopy()方法可以实现深复制。 需要注意的是,对于不可变对象(如字符串、数字、元组等),无论是深复制还是浅复制都是一样的结果。而对于可变对象(如列表、字典等),深复制复制整个对象,包括对象内部的所有数据,而浅复制只会复制对象的引用,而不会复制对象内部的数据。 下面是一个例子,展示了浅复制和深复制区别: ``` import copy # 浅复制 a = [1, 2, [3, 4]] b = copy.copy(a) a[2][0] = 5 print(a) # [1, 2, [5, 4]] print(b) # [1, 2, [5, 4]] # 深复制 c = copy.deepcopy(a) a[2][1] = 6 print(a) # [1, 2, [5, 6]] print(c) # [1, 2, [5, 4]] ``` 在上面的例子中,我们首先使用浅复制创建了一个列表b,然后修改了a列表中的一个元素。可以看到,由于浅复制复制了对象的引用,所以修改a列表中的元素同时也修改了b列表中的元素。 然后我们使用深复制创建了一个列表c,再次修改了a列表中的一个元素。可以看到,由于深复制复制的是整个对象,所以修改a列表中的元素并没有影响到c列表中的元素。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值