is与==的区别
a = [1,2,3]
b = [1,2,3]
a == b
==>True
a is b
==>False
数字在-5到256时如:
a = 1
b = 1
a is b ==> True
is判断两个引用是否指向同一对象(地址),引用比较
a = [1,2,3],b = [1,2,3]中两个列表存放的地址不同,可以用id(a),id(b)验证
==判断两个对象的值是否相等
copy与deepcopy
浅copy
a = [1,2,3]
b = a
==>id(a) == id(b)
深copy(需要导入copy模块)
c = copy.deepcopy(a)
==>id(a) != id(c)
此时在另一地址又存放了一份儿[1,2,3],由c指向这个地址,a还指向原来的[1,2,3]的地址,
当a指向的那块地址的值改变后如a.append(4),a变c不变。
另一例浅copy
a = [1,2,3]
b = [4,5,6]
c = [a,b]
d = c
此时a和b分别指向不同的内存地址,c开辟另一内存空间存放a和b这两个引用,就把c中的a指向原有的a指向的地址,
c中的b指向原有的b指向的地址。
d和c为浅copy,d指向c的内存地址。
另一例深copy
e = copy.deepcopy(c)
此时e开辟另一内存空间存放a和b这两个引用,就把这两个引用所指向的内容在另一地址又存放一份儿,并分别用e中的
a和b指向它们。
再一例copy.deepcopy()
a = [1,2,3]
b = [4,5,6]
c = (a,b) #不可变类型元组
d = copy.deepcopy(c)
a或b变d还是不变,原因与列表相同
还一例copy.copy()
a = [1,2,3]
b = [4,5,6]
c = [a,b]
e = copy.copy(c)
此时e另开一内存存放a,b两个引用,但这两个引用还是指向原来的a,b所指向的内存空间
最后一例copy.copy()
a = [1,2,3]
b = [4,5,6]
c = (a,b)#不可变类型
e = copy.copy(c)
此时e并不开辟另一内存空间,它指向c的地址,a或b变它也变
总结:
深copy,不管被copy的对象是可变类型还是不可变类型,都是另开辟一块内存空间,如果存
放的值是引用,
那将引用的内容也同样另开一块空间存放,其实就是只要是deepcopy之后,前后两者已经
没有任何关系了。
浅copy,如果被copy的对象是可变类型,就开另一地址存放,如果是不可变类型,它就直接
指向被copy对象的地址。如果存放的值是引用,不开辟另一内存空间,里面的引用还是指向原
来的那个地址,所有原来那个地址的值改变之后,copy过来的值也同时改变。