直接赋值
a = b a=b a=b意味着创建一个 b 的引用。这意味着 a a a 和 b b b 都指向内存中的同一个数组对象,因此对 a a a 的任何修改都会反映在 b b b 上,反之亦然。
b = [1,2,3,4,5]
a = b
print(id(a)==id(b))
a[2] = 9
print(f'a={a},b={b}')
###返回值
True
a=[1, 2, 9, 4, 5],b=[1, 2, 9, 4, 5]
切片赋值
使用 $c = b[:] $这样的语法时,你实际上是在创建 $b $的一个浅拷贝。这里的 $[:] $是切片操作,它创建了一个新的数组对象
c
c
c,该对象包含与 b 相同的元素。
但 c 和 b 是两个独立的对象,它们在内存中的地址不同,因此对 c 的修改不会影响到 b,反之亦然。
c = b[:]
print(id(c)==id(b))
c[2] = 9
print(f'c={c},b={b}')
###返回值
False
c=[1, 2, 9, 4, 5],b=[1, 2, 9, 4, 5]
深拷贝与浅拷贝
浅拷贝(如 b[:])只复制了最外层的容器,如果数组中还包含了其他容器,如列表、字典等,这些内部容器不会被复制,内部容器的引用仍然指向原始对象。
深拷贝(可以通过 copy 模块的 deepcopy 函数实现)会复制容器内的所有元素,包括内部容器及其内容,创建完全独立的对象。
d = [[1,2,3],(2,3,4),9]
e = d[:] #浅拷贝,最外层拷贝
e[2] = 1
print(id(d)==id(e))
print(f'e={e},d={d}')
print(id(e[2])==id(d[2]))
print(id(e[1])==id(d[1]))# 内层容器指向不变
### 返回值
False
e=[[1, 2, 3], (2, 3, 4), 1],d=[[1, 2, 3], (2, 3, 4), 9]
False
True
结论
当你需要创建数组的独立副本时,应该使用切片操作或者 copy 模块的方法来避免直接引用原始数组。这样可以保证原始数组和新数组的操作互不影响,避免在程序中产生意外的副作用。