对象浅复制

# -*- coding: utf-8 -*-

#浅复制
l1=[3,[55,44],(7,8,9)]
l2=list(l1)


print('id(l1[0]),id(l2[0]) :',id(l1[0]),id(l2[0]))
print('id(l1[1]),id(l2[1]) :',id(l1[1]),id(l2[1]))
print('id(l1[2]),id(l2[2]) :',id(l1[2]),id(l2[2]))
print('l2:',l2)

print('l1==l2:',l1==l2)
print('l2 is l1: ',l2 is l1)#l2 and l1 point to diff address

l1.append(100)#no influence to l2
l1[1].remove(55)#influence to l2

print('l1: ',l1)
print('l2: ',l2)

l2[1]+=[33,22]#influence to l1
l2[2]+=(10,11)#no influence to l1
print('l1: ',l1)
print('l2: ',l2)


print('id(l1[0]),id(l2[0]) :',id(l1[0]),id(l2[0]))
print('id(l1[1]),id(l2[1]) :',id(l1[1]),id(l2[1]))
print('id(l1[2]),id(l2[2]) :',id(l1[2]),id(l2[2]))

#综上所述,对于可变元素对象的可变元素,引用的地址是相同的,但是对于不可变元素,引用的地址是不同的,导致后面的修改会出现问题.



输出结果如下:
id(l1[0]),id(l2[0]) : 10919392 10919392
id(l1[1]),id(l2[1]) : 140211165347464 140211165347464
id(l1[2]),id(l2[2]) : 140211165654904 140211165654904
l2: [3, [55, 44], (7, 8, 9)]
l1==l2: True
l2 is l1:  False
l1:  [3, [44], (7, 8, 9), 100]
l2:  [3, [44], (7, 8, 9)]
l1:  [3, [44, 33, 22], (7, 8, 9), 100]
l2:  [3, [44, 33, 22], (7, 8, 9, 10, 11)]
id(l1[0]),id(l2[0]) : 10919392 10919392
id(l1[1]),id(l2[1]) : 140211165347464 140211165347464
id(l1[2]),id(l2[2]) : 140211165654904 140211166275456
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中,复制和深复制是用来创建对象副本的两种不同方式。 复制是创建一个新对象,该对象与原始对象共享相同的子对象。换句话说,复制复制对象的顶层结构,而不会复制嵌套对象本身。可以使用复制来创建一个新的可变对象,该对象与原始对象具有相同的状态。在Python中,可以使用切片操作符[:]、copy()函数或copy模块的copy()函数实现复制。 下面是一个复制的示例: ```python import copy # 原始列表 original_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] # 复制 shallow_copy = original_list.copy() # 修改副本中的子列表 shallow_copy[0][0] = 'A' print(original_list) # 输出: [[1,2, 3], [4, 5, 6], [7, 8, 9]] print(shallow_copy) # 输出: [['A', 2, 3], [4, 5, 6], [7, 8, 9]] ``` 深复制则是创建一个完全独立的新对象,包括所有嵌套对象。换句话说,深复制会递归地复制嵌套对象本身,而不是共享它们。可以使用copy模块的deepcopy()函数来实现深复制。 下面是一个深复制的示例: ```python import copy # 原始列表 original_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] # 深复制 deep_copy = copy.deepcopy(original_list) # 修改副本中的子列表 deep_copy[0][0] = 'A' print(original_list) # 输出: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] print(deep_copy) # 输出: [['A', 2, 3], [4, 5, 6], [7, 8, 9]] ``` 可以看到,深复制创建了一个全新的对象修改副本中的子列表不会影响原始列表。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值