基本概念
地址:变量值在计算机内存中存放的位置。
赋值:通常是把对象在计算机内存中存放的位置(地址)赋给变量。
引用
把一个对象在内存中存储的地址赋给不同变量,这些变量指向内存中相同的地址。修改其中任何一个变量的值,就是在修改指定地址存放的对象值,指向同一地址的变量的值跟随改变。
例如:
a=[1,2,3,4]
b=a
修改:a[2]=5
a和b同时改变,都变为[1,2,5,4]
浅copy
把一个变量的值,复制一份,给另一个变量。
非嵌套list
例如:c=[1,2,3,4,5]
d=c.copy() #计算机将c的值复制一份,放在新的内存地址中,将新地址传递给d
变量c,d的值存储在计算机内存的不同位置,修改其中一个不影响另一个变量。
修改: c[2]=5
c变为[1,2,5,4,5],d依然为[1,2,3,4,5]
list嵌套
如e=[1,2,3,[4,5,6]]
那么计算机将[1,2,3,[4,5,6]]存储的起始地址赋给e,这个地址存放了1,2,3
以及[4,5,6]这个嵌套对象在计算机中的存储地址,假定[4,5,6]的存储地址为c234:2345。
e指向的地址存放的值为1,2,3,c234:2345
f=e.copy()
此时将e的值1,2,3,c234:2345,复制一份,放在新的地址,将新的地址传给f。
注意:f的第三个元素(c234:2345),与e的第三个元素值(c234:2345)一样,这个值是一个地址,f[3]与e[3]将访问同一地址(c234:2345)的元素,对f[3]的修改,将导致e[3]同步修改。
例:
f[3][0]=0
f和e都将变为[1,2,3,[0,5,6]]
非嵌套部分的各变量修改独立。
例:
f[0]=9
f变为[9,2,3,[0,5,6]]
e依然为[1,2,3,[0,5,6]]
深copy
深copy的实现
import copy
g=copy.deepcopy(h) #将h深copy给g
深copy与浅copy不同的是,对于嵌套的list也实现值的copy,而不是地址。
例:
h=[1,2,3,[4,5,6]]
同样计算机将[1,2,3,[4,5,6]]存储的起始地址赋给h,这个地址存放了1,2,3
以及[4,5,6]在计算机中的存储地址,假定[4,5,6]的存储地址为c234:5545。
h指向的地址存放的值为1,2,3,c234:5545
g=copy.deepcopy(h) #深copy
将h的值1,2,3复制一份放在新的地址给g,对于嵌套的list[4,5,6],不同于浅copy,也同样将[4,5,6]复制一份放在新的内存位置如:c234:6645
g指向的地址存放的值就为1,2,3,c234:6645
这样对g的修改就不影响e,g,e完全独立
例:
g[3][0]=99
g变为[1,2,3,[99,5,6]]
e依然为[1,2,3,[4,5,6]]