我的清单:
a=[1,2,3,4,5]
b=a[:]
id(a)
>>2181314756864
id(b)
>>2181314855232 (different as slicing creates a new object)
id(a[0])
>>140734633334432
id(b[0])
>>140734633334432 (same)
b[0]=-1
b
>>[-1,2,3,4,5]
a
>>[1,2,3,4,5] --perfectly fine但是在numpy的情况下:
import numpy as np
l=np.array([1,2,3,4,5])
p=l[:]
id(l)
>>2181315005136
id(p)
>>2181315019840 (different as it creates a new object, which is fine)
id(l[0])
>>2181314995440
id(p[0])
>>2181314995952 (different)但是:
p[0]=-1
p
>>array([-1,2,3,4,5])
l
>>array([-1,2,3,4,5])尽管numpy数组的第一个元素的内存地址不同,但l也在更新。有人能解释一下这背后的概念吗?
发布于 2021-05-17 20:56:34
将id作为内存地址来讨论有点转移话题。是的,在CPython中,它恰好是一个内存地址,但是什么的地址呢?碰巧不是实际的数字数据,而是描述数字数据的Python对象!
numpy中的切片创建了一个新的Python对象(因此有一个不同的id),但新对象与旧对象共享实际数组的存储空间。
如果是id(A) == id(B),那么,例如,A.shape不可能与B.shape不同!
https://stackoverflow.com/questions/67569368
复制相似问题