在python中,给一个对象赋值,实际上就是对象对内存空间存储的值的引用。当我们把对象赋值给另一个变量的时候,这个变量并没有拷贝这个对象,而只是拷贝了这个对象的引用而已。
一般情况下我们会通过三种方法来实现拷贝对象的引用。
Python直接赋值
直接赋值,默认浅拷贝传递对象的引用而已,原始列表改变,被赋值的变量也会做相同的改变。其实就是对‘对象'的引用
示例:
> list_demo = [2, 4, 6] > a = list_demo > print(a) [2, 4, 6] > id(list_demo) 65006808 > id(a) 65006808 > list_demo.append(8) > print(list_demo) [2, 4, 6, 8] > print(a) [2, 4, 6, 8] > id(list_demo) 65006808 > id(a) 65006808 >
通过 id() 函数我们可以得出,变量 list_demo 与 a 指向的都是同一个内存空间地址,当被赋值的 list_demo改变,被赋值的 a 同样会做相同的改变。这种现象普遍存在于 Python 之中,这种赋值的方式实现了 “假装” 拷贝,真实的情况还是两个变量和同一个对象之间的引用关系。
Python浅拷贝
import copy 模块的 copy.copy() 方法,该方法只拷贝父对象,没有拷贝子对象。且浅拷贝是创建一块新的内存空间,但是内存空间内的元素的地址均是父对象元素的地址的拷贝。所以当父对象内部的子对象发生改变时,拷贝对象的内部的子对象也会跟着改变。
示例:
> list_demo1 = [2, 4, 6, [8, 10]] > a = list_demo1 > print(list_demo1) [2, 4, 6, [8, 10]] > print(a) [2, 4, 6, [8, 10]] > > > import copy > b = copy.copy(list_demo1) > id(list_demo1) 65103472 > id(b) 6011200 > list_demo1.append(12) > print(list_demo1) [2, 4, 6, [8, 10], 12] > list_demo1[3] [8, 10] > > > > list_demo1[3].append('hello') > print(list_demo1) [2, 4, 6, [8, 10, 'hello'], 12] > print(b) [2, 4, 6, [8, 10, 'hello']] > list_demo1[3] [8, 10, 'hello'] > b[3] [8, 10, 'hello'] > > > > id(list_demo1) 65103472 > id(b) 6011200 > id(list_demo1[3]) 64679128 > id(b[3]) 64679128 >
从上述代码可以看出,在执行浅拷贝的时候,浅拷贝实际上只拷贝引用,不拷贝内容。同时,浅拷贝会针对父对象的子对象进行判断,当父对象的子对象发生改变时,拷贝对象内的子对象同时也跟着改变。
Python深拷贝
import copy 模块的 copy.deepcopy() 方法,深拷贝与浅拷贝相反,就是彻彻底底的拷贝,完全的拷贝了父对象及子对象,同时指向一个新的内存空间地址。此时,虽然源对象与拷贝对象的内容是一样的,但是不管针对谁进行改动,另一个是丝毫不会受到影响的。
> list_demo2 = [2,3,4]
> c= copy.deepcopy(list_demo2)
> print(list_demo2)
[2, 3, 4]
> print(c)
[2, 3, 4]
> id(list_demo2)
6011440
> id(c)
6012440
> list_demo2.append(['a','b'])
> c.append([5,6])
> print(list_demo2)
[2, 3, 4, ['a', 'b']]
> print(c)
[2, 3, 4, [5, 6]]
> list_demo2[3].append('c')
> c[3].append(7)
> print(list_demo2)
[2, 3, 4, ['a', 'b', 'c']]
> print(c)
[2, 3, 4, [5, 6, 7]]
>
从上述代码示例可以看出 list_demo2 与 c 相互独立,无论 list_demo2 与 c本身进行了修改,或者各自的子对象进行了修改 都没有互相影响。
总结
Python赋值
赋值的本质就是将一个对象的内存空间地址赋值给一个变量,让变量指向该内存空间地址。
Python浅拷贝
浅拷贝是拷贝了源对象的引用,并创建了一个新的内存空间地址。但是引用的对象的子对象的地址仍然是源对象的,所以当源对象的子对象发生改变时,拷贝对象内的子对象同时也跟着改变。
Python深拷贝
深拷贝就是彻底的拷贝,完全的拷贝了父对象及子对象,同时指向一个新的内存空间地址。源对象与拷贝对象之间的修改互不影响。
更多关于Python的赋值、深拷贝与浅拷贝的区别文章请查看下面的相关链接
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 张韶涵2024 《不负韶华》开盘母带[低速原抓WAV+CUE][1.1G]
- lol全球总决赛lcs三号种子是谁 S14全球总决赛lcs三号种子队伍介绍
- lol全球总决赛lck三号种子是谁 S14全球总决赛lck三号种子队伍
- 群星.2005-三里屯音乐之男孩女孩的情人节【太合麦田】【WAV+CUE】
- 崔健.2005-给你一点颜色【东西音乐】【WAV+CUE】
- 南台湾小姑娘.1998-心爱,等一下【大旗】【WAV+CUE】
- 【新世纪】群星-美丽人生(CestLaVie)(6CD)[WAV+CUE]
- ProteanQuartet-Tempusomniavincit(2024)[24-WAV]
- SirEdwardElgarconductsElgar[FLAC+CUE]
- 田震《20世纪中华歌坛名人百集珍藏版》[WAV+CUE][1G]
- BEYOND《大地》24K金蝶限量编号[低速原抓WAV+CUE][986M]
- 陈奕迅《准备中 SACD》[日本限量版] [WAV+CUE][1.2G]
- TWINS.2004-SUCHABETTERDAY精美礼盒特别版2CD【英皇娱乐】【WAV+CUE】
- 音乐磁场.1991-1998-音乐磁场系列22CD【瑞星】【WAV+CUE】
- 韦绮姗.1993-LOVE.ME.ONCE.AGAIN【永高创意】【WAV+CUE】