1.赋值
a = 1
print(id(a))
b = a
print(id(b))
a = 2
print(id(a))
print(id(b))
输出结果为:
258226432
258226432
258226448
258226432
通过输出结果我们可以发现,当给变量a赋值1时,python会首先给值1划分一定空间存放这个值,这个值1的id为258226432,然后将a指向该空间,再将a赋值给b的时候,b也指向了该空间。再将2赋值给a时,首先会划分一个空间存放2的值,再将a指向2所在的空间,而此时b的值不变。
2.浅拷贝
语法:copy.copy
import copy
list1 = [1,2,[3,4]]
print(id(list1))
print(id(list1[2]))
list2 = list1[:]
print(list2)
print(id(list2))
print(id(list2[2]))
list3 = copy.copy(list1)
print(list3)
print(id(list3))
print(id(list3[2]))
list1[2].append(5)
print(list1)
print(id(list1))
print(id(list1[2]))
print(list2)
print(id(list2))
print(id(list2[2]))
print(list3)
print(id(list3))
print(id(list3[2]))
list1.append(6)
print(list1)
print(id(list1))
print(id(list1[2]))
print(list2)
print(id(list2))
print(id(list2[2]))
print(list3)
print(id(list3))
print(id(list3[2]))
输出结果为:
10368824
10367904
[1, 2, [3, 4]]
10833592
10367904
[1, 2, [3, 4]]
10833792
10367904
[1, 2, [3, 4, 5]]
10368824
10367904
[1, 2, [3, 4, 5]]
10833592
10367904
[1, 2, [3, 4, 5]]
10833792
10367904
[1, 2, [3, 4, 5], 6]
10368824
10367904
[1, 2, [3, 4, 5]]
10833592
10367904
[1, 2, [3, 4, 5]]
10833792
10367904
通过对比可以发现,浅拷贝只会拷贝第一层地址,深层地址不会拷贝,当深层地址随内容改变而改变的时候,浅拷贝的内容也会随之改变。
3.深拷贝
语法:copy.deepcopy
import copy
list1 = [1,2,[3,4]]
print(list1)
print(id(list1))
print(id(list1[2]))
list2 = copy.deepcopy(list1)
print(list2)
print(id(list2))
print(id(list2[2]))
list2[2].append(5)
print(list1)
print(id(list1))
print(id(list1[2]))
print(list2)
print(id(list2))
print(id(list2[2]))
输出结果为:
[1, 2, [3, 4]]
13186872
13185992
[1, 2, [3, 4]]
13651680
13651880
[1, 2, [3, 4]]
13186872
13185992
[1, 2, [3, 4, 5]]
13651680
13651880
通过输出结果可知,当使用深拷贝的时候,深层地址也会被拷贝,改变内嵌列表的内容,原本列表的内容不会改变。
网友评论