我们都知道 所谓变量就是就是在空间中开辟一块内存空间。来存放东西的
学过c语言的都知道而数组也是有内存地址的
我们如何来查看内存地址呢?id()这函数就来了
x = 5 print(id(x))
如此一来我们就可以查看x的内存地址了他的内存地址是
1940307088
首先我们来看一个现象
我们把数组赋值给一个变量a 然后在把a赋值给b 在来改变a的值 看看b 是否会发生变化呢?
a = [1,2,3] b = a a[0] = 11 print(b)
得出的结果是
[11, 2, 3]
很显然发生了变化,这是什么原因造成的呢?最好的办法就是查一下他们的id
print(id(a) == id(b))
结果是 True
很显然他们指向了同一块内存地址, 为什么会出现这种情况呢?我们在学c语言的是时候啊 知道数组的地址就是数组的首地址,所以我们可以直接赋值,
但是内存地址没有发生改变。为了解决这一情况,我们可以采用copy的方法来将数据拷贝出来
首先 我们import 出copy的库来
import copy a = [1,2,3] b = copy.copy(a) a[0] = 11 print(b) print(id(a) == id(b))
我们看一下结果
[1, 2, 3] False
可以看出我们地址不相同了 现在改变数组里面的元素也与b无关了
哪我们升级一下改变一下难度 我们把a 变成
a = [1,2,[1,2,3]]
import copy a = [1,2,[1,2,3]] b = copy.copy(a) a[2][0] = 11 print(b)
结果是
[1, 2, [11, 2, 3]]
我擦居然还是变了,这是怎么回事?你发现只能copy第一层 于是你不甘心你又加了字典
import copy a = [1,2,[1,2,3],{‘wocao‘:123456}] b = copy.copy(a) a[3][‘wocao‘] = 11 print(b)
结果是
[1, 2, [1, 2, 3], {‘wocao‘: 11}]
于是你恍然大悟啊。。。。原来copy只能浅浅的copy一层啊!!!
还好你上课听讲,听见了老师说了深深的copy,于是你又拿出来试试
import copy a = [1,2,[1,2,3],{‘wocao‘:123456}] b = copy.deepcopy(a) a[3][‘wocao‘] = 11 a[2][1] = 11 print(b)
得出来
[1, 2, [1, 2, 3], {‘wocao‘: 123456}]
好家伙原来是这么回事啊
原文地址:https://www.cnblogs.com/BookMiki/p/10192870.html
时间: 2024-11-09 07:31:15