基本概念:
任何对象都有三个属性:唯一标识符,类型和值。
引用:在程序中,每个对象都会在内存中申请一块空间来存放该对象,对象在内存中的地址叫做引用,通过变量名来引用。 赋值:给对象赋予另外一个别名,把对象的地址赋值给一个变量,让变量指向该内存地址。 浅复制:就是复制了,但是并不完全复制,浅复制之后的确生成了一个新的对象,但是有些情况下新的对象还是和复制的对象有着千丝万缕的联系。 深复制:深复制才是真正的复制,它是一次性把所有的东西都复制过来,是完整的复制,复制之后就和复制的对象不再有任何联系了。 id()是一个内置函数,它返回对象的唯一标识,用于获取对象的内存地址。
示例:创建一个新变量 i='hello world'
a='hello world'
创建一个变量i,创建一个对象(分配一块内存)来存储值'hello world'。通过指针将变量连接到对象。从变量到对象的连接称为引用(变量引用对象)。
任务
i='hello world'
j=i
id(i)
id(j)
传奇:
浅拷贝:
意思是说复制了,但是不完全复制,浅复制之后确实生成了新的对象,但是有些情况下新的对象还是和复制的对象有着千丝万缕的联系。
目的:避免对原始数据进行更改,因为以后无法查看该数据。
方法:有些对象自身的copy()方法,copy模块中的copy()方法
不可变对象的浅拷贝:
import copy
i=7
# 浅拷贝
j=copy.copy(i)
print(id(i))
print(id(j))
修改i值:
# 修改i的值
i=14
print(id(i))
print(id(j))
综上所述:浅拷贝过程中,对象的引用(内存地址)不会发生改变
可变对象的浅拷贝:
list_1 = [1, 2, 3]
#非嵌套浅拷贝
list_1_copy = copy.copy(list_1)
id(list_1)
id(list_1_copy)
总结:修改后,内存地址不变,但是值变了;浅复制后,内存地址变了。也就是说,对于非嵌套的浅复制,复制前后,二者是独立的实体。
list_2 = [1, 2, [3, 4, 5]]
# 嵌套列表浅拷贝
list_2_copy = copy.copy(list_2)
id(list_2) --->2952777485128
id(list_2_copy) --->2952778020168
id(list_2[2][0]) --->1434479744
id(list_2_copy[2][0]) --->1434479744
print(list_2)
print(list_2_copy)
修改前:打印结果------>[1, 2, [3, 4, 5]]
修改前:打印结果------>[1, 2, [3, 4, 5]]
结果:从上面的观察可以看出,嵌套中的列表id(内存地址)是相同的,但是整体的列表id(内存空间)是不同的;
修改数据:
list_2[1]='cf'
list_2[2][0]='c'
print(list_2)
print(list_2_copy)
修改后:打印结果------>[1, 'cf', ['c', 4, 5]]
修改后:打印结果------>[1, 2, ['c', 4, 5]]
总结:
在嵌套复制中,修改嵌套列表数据后,嵌套列表数据:原始数据和复制的数据都会改变。
嵌套复制中,修改非嵌套列表数据后,嵌套列表数据:原数据发生变化,复制的数据保持不变。
可以看出数据的浅拷贝只是浅层的拷贝,而不是深层的拷贝!!!
接下来是深复制:-->浅复制,深复制(2)
扫一扫在手机端查看
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。