不可变变量
不可变量包括:数值类型、字符串和元组。一旦被重新赋值,变量对应的内存地址就会发生改变。
可变变量
不可变量包括:列表、字典、集合。添加或者修改数据时,变量对应的内存地址不会改变。也就是可变类型,一直在引用原来的内存地址。
注意:如果是重新赋值(不是添加和修改),那地址是会改变的,引用了新的内存地址。
a = "abc"
b = "abc"
print(id(a), id(b)) #2513440771856 2513440771856
c = [1, 2]
d = [1, 2]
print(id(c), id(d)) #1961245043848 1961247346632
d = [3, 4]
e = d[:] #切片是浅拷贝
print(id(d), id(e)) #1961247392008 1961247346632
d = [3, 4]
print(id(d)) #1961247391880
d.append(5)
print(id(d)) #1961247391880
s = set([1, 3])
s1 = set([1, 3])
print(id(s), id(s1)) #1960972183144 1961246939848
赋值
a=b:赋值,a和b指向同一对象(或者理解为地址)。
引用大佬的一个图:
a = 1
b = a
print(id(a), id(b)) # 1910664208 1910664208
b = 2
print(id(a), id(b), a, b) # 1910664208 1910664240 1 2
a_list = [1, 2, 3]
print(id(a_list), a_list) # 2098327073416 [1, 2, 3]
a_list.append(4)
print(id(a_list), a_list) # 2098327073416 [1, 2, 3, 4]
注意:很多同学会混淆一个概念,b=a时,b指向a指向的对象①,b=2,b就指向了另外一个对象②,这时候a是不变的,它还是指向原来的对象①,不会跟着b指向对象②!!!我以前在这个点上脑子一直转不过来。
浅拷贝
b = a.copy(): 浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。

a.append(4)
print(id(a), id(b), a, b) # 2281618944776 2281618944968 [1, ['r', 's', 't'], 2, 3, 4] [1, ['r', 's', 't'], 2, 3]
b[1].append("全都有我")
print(id(a), id(b), a, b) # 2281618944776 2281618944968 [1, ['r', 's', 't', '全都有我'], 2, 3, 4] [1, ['r', 's', 't', '全都有我'], 2, 3]
看完我上面的代码,其实很好理解,浅拷贝就是拷贝了最外层的一层壳,里面的还是指向同一个对象。
深拷贝
b = copy.deepcopy(a): 深度拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。
import copy
a = [1, ["r", "s", "t"], 2, 3]
b = copy.deepcopy(a)
a.append(4)
print(id(a), id(b), a, b) # 2978778657992 2978778657672 [1, ['r', 's', 't'], 2, 3, 4] [1, ['r', 's', 't'], 2, 3]
b[1].append("全都有我")
print(id(a), id(b), a, b) # 2978778657992 2978778657672 [1, ['r', 's', 't'], 2, 3, 4] [1, ['r', 's', 't', '全都有我'], 2, 3]
深拷贝就是拷贝出来一个完全独立不受对方影响的对象。
最后感谢大佬:
这个太牛逼了,图画得清晰明了,小弟借用一下:
https://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html
https://www.cnblogs.com/andy9468/p/13021987.html