欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

从零开始的Python学习Episode 8——深浅拷贝

程序员文章站 2024-02-04 12:55:10
深浅拷贝 一、浅拷贝 列表中存储的是数据的内存地址,当我们要查询或修改列表中的数据时,我们是通过列表中的地址找到要访问的内存。当我们修改列表中的数据时,如果修改的是一个不可变类型(整型,长整型,浮点数,复数,布尔,字符串,元组),会开拓一个新的内存空间用于存放新的数据,然后把列表中的地址修改为存放新 ......

深浅拷贝

 

一、浅拷贝

列表中存储的是数据的内存地址,当我们要查询或修改列表中的数据时,我们是通过列表中的地址找到要访问的内存。当我们修改列表中的数据时,如果修改的是一个不可变类型(整型,长整型,浮点数,复数,布尔,字符串,元组),会开拓一个新的内存空间用于存放新的数据,然后把列表中的地址修改为存放新数据的地址,此时没有出现问题。但当列表中存的不是一个简单的数据,而是一个可变类型(列表,字典),就会出现问题。下面用一个例子来解释:

print('修改前')
a = [[1,2],3,4]
b = a.copy()
print('a的值为',a)
print('b的值为',b)
print('修改后')
b[0][1]=3
print('a的值为',a)
print('b的值为',b)

  输出如下

从零开始的Python学习Episode 8——深浅拷贝

结果发现修改了b中的值之后a中的值也跟着改变了。

这是因为a中存的是列表[1,2]地址,a和b中的列表[1,2]地址是相同的,我修改b中的数据改变的是列表[1,2]内存地址所指向的数据,而没有修改列表[1,2]本身的地址,b还在指向列表[1,2],所以a和b会相互影响。

用一张图来简单解释:

从零开始的Python学习Episode 8——深浅拷贝

 

为了解决这样的问题,可以使用

二、深拷贝

深拷贝可以重新开辟内存空间,将内容复制的更彻底,a和b之间相互没有影响。

import copy

print('修改前')
a = [[1,2],3,4]
b = copy.deepcopy(a)
print('a的值为',a)
print('b的值为',b)
print('修改后')
b[0][1]=3
print('a的值为',a)
print('b的值为',b)

  结果

从零开始的Python学习Episode 8——深浅拷贝

这样的话a和b之间就不会互相影响了。

 

 

以上为个人理解,有误的话还请路过的大佬指正一下。