浅拷贝

依然范特西╮ 提交于 2019-12-04 13:37:12

1、可变对象

所谓可变对象是指,可变对象的值可变,身份是不变的,比如:列表、字典、集合

a = [1,2,3]print("a 的内存地址是:%s"%id(a))# a 的内存地址是:1805507242440b = aprint("b 的内存地址是:%s"%id(b))# b 的内存地址是:1805507242440b.append(4)print("列表变化后 b的内存地址:%s"%id(b))#列表变化后 b的内存地址:1805507242440

从这里我们可以看出, 当b的内容发生了变化后,他对应的内存地址并没有发生变化

 

2、不可变对象

不可变对象就是对象的身份和值都不可变。新创建的对象被关联到原来的变量名,旧对象被丢弃,垃圾回收器会在适当的时机回收这些对象,比如:数字、字符串、元组

a = "hello"print("a 的内存地址是:%s"%id(a))# a 的内存地址是:2417528259448b = aprint("b 的内存地址是:%s"%id(b))# b 的内存地址是:2417528259448b = "world"print("列表变化后 b的内存地址:%s"%id(b))# 列表变化后 b的内存地址:2417558204856

从这里可以看出,当b的内容发生了变化时,他对应的内存地址发生了变化,重新分配了一个内存地址

 

3、浅拷贝

a = [["hello", "world"],2,3]print("a 的内存地址是:%s"%id(a))b = a.copy()print("b 的内存地址是:%s"%id(b))

b拷贝a的内容后,打印a和b的内存地址

a 的内存地址是:1273303705352
b 的内存地址是:1273303730952

 

**可以看出他们的内存地址是一样的

 

修改列表中的不可变对象

a = [["hello", "world"],2,3]print("a 的内存地址是:%s"%id(a))b = a.copy()# 修改a中的不可变元素 2变成testa[1] = "test"print(a)print("修改a中的不可变元素, b的内存地址是:%s"%id(b))print("修改a中的不可变元素, a的内存地址是:%s"%id(a))

**

a 的内存地址是:2719293548296
[['hello', 'world'], 'test', 3]
修改a中的不可变元素, b的内存地址是:2719293573896
修改a中的不可变元素, a的内存地址是:2719293548296

 

修改列表中的可变对象

#修改a中的可变元素["hello", "world"]中的"hello"="new_hello"a = [["hello", "world"],2,3]print("a 的内存地址是:%s"%id(a))b = a.copy()a[0][0] = "new_hello"print(a)print("修改a中的可变元素, b的内存地址是:%s"%id(b))print("修改a中的可变元素, a的内存地址是:%s"%id(a))

**

a 的内存地址是:1884588016136
[['new_hello', 'world'], 2, 3]
修改a中的可变元素, b的内存地址是:1884588018504
修改a中的可变元素, a的内存地址是:1884588016136

 

从上面的数据可以看出

修改a中的不可变对象,a和b的内存地址都没有发生变化

修改a中的可变对象,a的内存地址没有发生变化,b的内存地址发生了变化

浅拷贝只能拷贝可变对象中的第一层数据,当第二层数据发生了变化时,如:["hello", "world"] 身份就会发生变化

 

 


 

 

 

 

 

 

 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!