1,“相等”与“相同”
我们先赋值三个变量a, b, c:
a = [1, 2, [1, 2]]
b = [1, 2, [1, 2]]
c = a
判断一下‘相等’:
a == b 返回 True
a == c 返回 True
b == c 返回 True
判断一下‘相同’:
a is b 返回 False
b is c 返回 False
a is c 返回 True
这里说明了,‘相等’和‘相同’是不一样的。==是一个比较运算符,用来比较对象值是否相等,若相等返回True,否则返回False。
python官方手册解释的is为object identity,其实就是判断是否为同一个对象,也就是其储存地址是否相同,相同返回True,否则返回False。
所以说a is b的等价形式是 id(a) == id(b)。
这里面没有涉及到拷贝,a 与b就是单纯的建造两个变量,‘恰巧’它们的值相等。
2.浅拷贝与深拷贝
浅拷贝和深拷贝是相对引用来说的。
上例中c = a,将a的值附给c,那么a与c不仅值是相等的,其内存地址也是相同的,换句话说这就是一个对象的两个名字而已。这就是引用
实现浅拷贝最方便的就是使用切片了:
d = a[:]
当然copy模块中的copy函数也可以实现浅拷贝:
d = copy.copy(a)
这里的d就是a的浅拷贝;
a == d 返回 True
a is d 返回 False
a[2] == d[2] 返回 True
a[2] is d[2] 返回 True
从这里可以看出,变量a和d的值相等,内存地址不同;但是其元素的地址相同;这就是“浅”的含义了,重新定义了外层的内存地址,但是其元素地址未变。
对于深拷贝:
e = copy.deepcopy(a)
a == e 返回 True
a is e 返回 False
a[2] == e[2] 返回 True
a[2] is e[2] 返回 False
与浅拷贝不同,深拷贝将元素的内存地址也变了。也就是说深拷贝的结果与之前的变量已经“没关系啦”就像前面提到的变量a和b一样。
3.不可变对象