变量类型
Python变量分为可变变量和不可变变量
不可变变量:整型(int)、字符串型(str)、元组(tuple)
可变变量:列表(list)、集合(set)、字典(dict)
不可变变量
赋值
对同一变量的重复赋值操作,是开辟新的内存空间指向变量
a = 'haha' ; c = 1;d = 257
print(id(a),id(c),id(d))
# 地址 :2104344832240 2104259510512 2104356067888
a = 'hahahahahahah';c = 2;d = 257
print(id(a),id(c),id(d))
#地址 :2104336334576 2104259510544 2104356069072
由测试样例可以推出每一次赋值都是开辟新的内存空间,而不是给原变量内存空间赋不同的值。
PS:验证对同一变量赋相同值的时候,如果用的是整型变量,请选择[-5,256]区间之外的数,原因是Python为了防止重复创建导致内存的增加,事先已经创建好了这些对象,放入到小整数对象池中。每当给变量赋值-5到256之间的数值时,其本质是对小整数对象池中对象的引用,所以地址固定。
拷贝
不可变变量无拷贝操作(PS:不可变变量不能更改数据中的值,只能进行重新赋值,所以也没有讨论的必要)
可变变量
赋值
1.对同一变量的赋值与不可变变量结果相同。
2.不同变量间的赋值相当于引用操作,指向同一存储空间,两个变量等价,任何一方发生改变都会影响另一方
m = [1,2,3]
n = m
print(id(m),id(n)) #2104345865536 2104345865536
n [0] = 6
print(m,n) #[6, 2, 3] [6, 2, 3]
m[2] = 4
print(m,n) #[6, 2, 4] [6, 2, 4]
拷贝(以列表为例)
浅拷贝
-
copy()方法
对于List来说,其第一层,是实现了深拷贝,但对于其内嵌套的List,仍然是浅拷贝。
因为嵌套的List保存的是地址,复制过去的时候是把地址复制过去了,嵌套的List在内存中指向的还是同一个。old = [1,2,[3,4],5] new = old.copy() new[0] = 9 #第一层实现深拷贝,新列表数值改变不会影响原列表 new[2][0] = 6 #改变列表里的列表的值,原列表也会发生改变 print(old) #[1, 2, [6, 4], 5] print(new) #[9, 2, [6, 4], 5]
-
列表生成式(等价于for循环遍历生成)
使用列表生成式产生新列表也是一个浅拷贝方法,只对第一层实现深拷贝。old = [1,[1,2,3],3] new = [i for i in old] new =[] for i in range(len(old)): new.append(old[i]) new[0] = 9 new[1][1]= 6 print(old) #[1, [1, 6, 3], 3] print(new) #[9, [1, 6, 3], 3]
-
切片
通过使用 [ : ] 切片,可以浅拷贝整个列表,同样只对第一层实现深拷贝。old = [1,[1,2,3],3] new = old[:] new[0] = 9 new[1][1]= 6 print(old) print(new) #输出结果同上
深拷贝
-
deepcopy函数
from copy import deepcopy m = [[1,2],3,4] n = deepcopy(m) n[0][0]=6 print(m) #[[1, 2], 3, 4] print(n) #[[6, 2], 3, 4]
以上总结均为参考Python选修课课程内容和大佬们的笔记所写,如有错误,欢迎大家在评论区指正。