赋值
- Python中的赋值语句不会复制对象,只是建立一个引用关联,原数据变,赋值后的数据也会变。
- 小整数对象池:Python把**[-5, 256]**之间的数字提前建立好,不会被垃圾回收。这范围中的数值相等,则地址也会相等,因为都是同一个对象。例如:
var1 = -5
print(id(-5))
print(id(var1))
var2 = -6
print(id(-6))
print(id(var2))
is和==的区别
- is用来判断两个变量引用对象是否相同(地址是否相同);
- ==用来判断两个变量的值是否相同。
- is的判断条件更加苛刻
浅拷贝 copy
- 如果浅拷贝的对象是不可变的数据类型(符合数据类型只要最外侧的类型是不可变),那么浅拷贝语句与赋值语句效果一样。
- 如果浅拷贝对象是可变数据类型(符合类型只要最外侧的类型可变即可),那么浅拷贝会把该对象复制一份,但是该对象中的其他所有元素(包括符合类型数据中的元素),仍然为引用关系。
- list.copy(), dict.copy(), set.copy()和切片是属于浅层copy。
深拷贝 deepcopy
- 如果深拷贝对象是不可变数据类型(复合数据类型还需确保其中的所有元素不可变),那么深拷贝语句和赋值语句等效。
- 如果深拷贝对象是可变数据类型或者其中的赋值类型数据中有可变的元素,那么深拷贝会把该对象复制一份。
- 对于其中的原始分别递归的去适用前两点规划
import copy
tup1 = (911, "abc", [])
tup2 = copy.deepcopy(tup1)
print(tup1)
print(tup2)
print(id(tup1))
print(id(tup2))
print(id(tup1[0]))
print(id(tup2[0]))
print(id(tup1[1]))
print(id(tup2[1]))
print(id(tup1[2]))
print(id(tup2[2]))