15 赋值、浅拷贝和深拷贝区别_is和==的区别

 欢迎来到@一夜看尽长安花 博客,您的点赞和收藏是我持续发文的动力

对于文章中出现的任何错误请大家批评指出,一定及时修改。有任何想要讨论的问题可联系我:3329759426@qq.com 。发布文章的风格因专栏而异,均自成体系,不足之处请大家指正。

    专栏:

文章概述:对Python浅拷贝与深拷贝的介绍

关键词:Python浅拷贝与深拷贝

本文目录

Python浅拷贝与深拷贝

直接赋值代码示例

浅拷贝(copy):

深拷贝(deepcopy)

  

Python浅拷贝与深拷贝

  • 直接赋值:其实就是对象的引用(别名)。
  • 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。
  • 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。

直接赋值代码示例

# 直接赋值
a = [11, 22, 33]
b = a

# 打印列表 b
print(b)  # 输出: [11, 22, 33]

# 打印内存地址(可选)
# print(id(a), id(b))

# 用来判定 a 和 b 地址和对应的值完全相等
print(a is b)  # True, 因为 b 是通过直接赋值引用了 a
print(a == b)  # True, 因为 a 和 b 的内容相同  (不是看是否地址相同)
#和java中不太一样,java中要么是数值比较大小,要么判断地址(是否是同一个对象)
c = {'name': 'baizhan'}
d = c
# print(id(c), id(d))
print(c is d) #True
print(c == d) #True

a.append(44)  
print(a)  #[11, 22, 33, 44]
print(b)  #[11, 22, 33, 44]
print(a is b)   #True
print(a == b)   #True

c['age'] = 21
print(c)  #{'name': 'baizhan', 'age': 21}
print(d)  #{'name': 'baizhan', 'age': 21}
print(a is b) #True
print(a == b) #True

浅拷贝(copy):

# 浅拷贝
a = [1, 2]
b = [3, 4]
c = [a, b]
d = c  # d 和 c 引用的是同一个对象

#浅拷贝
#只是给父级新开辟了一个空间,里面的子元素还是指向父级的子元素
import copy  #导入copy模块,模块里有深浅拷贝两个模块
e = copy.copy(c)
# 或者使用e=c.copy()  
'''c.copy()
来源:列表、字典等内置数据结构提供的 copy() 方法。
适用范围:只适用于提供了 copy() 方法的对象,如列表、字典和某些自定义类。'''
# print(id(c), id(d), id(e))
print(c is e)  # False, e 是一个新的对象
print(c == e)  # True, e 和 c 的内容相同


print(c[0] is d[0]) #true  完全相同
print(c[0] is e[0]) #true  子地址相同

a.append(5) 
b.append(6)
print(c)   #[[1, 2, 5], [3, 4, 6]]
print(d)   #[[1, 2, 5], [3, 4, 6]]
print(e)   #[[1, 2, 5, 5], [3, 4, 6, 6]]

深拷贝(deepcopy)

import copy

# 深拷贝
a = [1, 2]
b = [3, 4]
c = [a, b]
d = copy.deepcopy(c)
print(c is d)      #False
print(c[0] is d[0])#False
print(c[1] is d[1])#False

c.append(5)
print(c)
print(d)#没影响

a.append(3)
b.append(5)
print(c)  #[[1, 2], [3, 4], 5]
print(d)  #没影响[[1, 2], [3, 4]]


d[0].append(5)
d[1].append(6)
print(d)
print(c)#没影响

d.append(7)
print(d)
print(c)  #没影响

  • 14
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值