说明:
今天看到一个小题,然后就好奇的做了一下。
问题: 有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?
问题解决:
代码:
我这里使用的是copy,但是发现使用copy和deepcopy,num_list2 的改变,num_list1都不会改变,结果都是一样的。所以我就好奇,为什么会这样?我记得好像浅copy下,num_list1浅会随着num_list2 的改变而改变;深copy不会改变,而是复制一份,现在怎么都是像复制一份?我带着心中的疑惑,接着往下尝试,测试
1 | import copy |
2 | |
3 | num_result_list = [] |
4 | num_list1 = [1, 2, 3, 4] |
5 | for i in num_list1: |
6 | # num_list2 = copy.copy(num_list1) |
7 | num_list2 = copy.deepcopy(num_list1) |
8 | num_list2.remove(i) |
9 | print("copy",num_list2,num_list1) |
10 | for j in num_list2: |
11 | num_list3 = copy.deepcopy(num_list2) |
12 | num_list3.remove(j) |
13 | # print(i,j) |
14 | for k in num_list3: |
15 | num_result = i * 100 + j * 10 + k |
16 | print('num_result',num_result) |
17 | num_result_list.append(num_result) |
18 | |
19 | print("num_result_list",len(num_result_list)) |
1、num_list1列表中为不可变元素:
测试深浅拷贝的区别:
仔细测试一下,二者的区别:
1 | import copy |
2 | num_list1 = [1, 2, 3, 4] |
3 | |
4 | # num_list2 = copy.deepcopy(num_list1) |
5 | num_list2 = copy.copy(num_list1) |
6 | num_list1[2] = 11 |
7 | num_list2.append([1,2]) |
8 | num_list1.append([55]) |
9 | num_list2[2] = 22 |
10 | print(num_list2, num_list1) |
11 | print(id(num_list2),id(num_list1)) |
12 | # deepcopy |
13 | # [1, 2, 22, 4, [1, 2]] [1, 2, 11, 4, [55]] |
14 | # 1858350757192 1858350757256 |
15 | # copy |
16 | # [1, 2, 22, 4, [1, 2]] [1, 2, 11, 4, [55]] |
17 | # 2650286536008 2650286536072 |
最后如果num_list1 的元素都是不可变类型情况下,copy和deepcopy是一样的。
2、num_list1列表中有可变元素:
num_list1中还有一个可变的元素设为list,然后测试copy和deepcopy的区别:
1 | |
2 | import copy |
3 | |
4 | num_list1 = [1, 2, 3, 4,[5,6]] |
5 | # num_list2 = copy.deepcopy(num_list1) |
6 | num_list2 = copy.copy(num_list1) |
7 | num_list1[4][0] = 11 |
8 | num_list2.append([1,2]) |
9 | num_list2[4][0] = 22 |
10 | num_list1.append([55]) |
11 | print(num_list2,num_list1) |
12 | print(id(num_list2),id(num_list1)) |
13 | |
14 | # deepcopy |
15 | # [1, 2, 3, 4, [22, 6], [1, 2]] [1, 2, 3, 4, [11, 6], [55]] |
16 | # 1872840451720 1872840439112 |
17 | # copy |
18 | # [1, 2, 3, 4, [22, 6], [1, 2]] [1, 2, 3, 4, [22, 6], [55]] |
19 | # 1517600138824 1517600126280 |
3、总结
- 深拷贝deepcopy相当于复制一份,浅拷贝copy相当于引用,但是id都不相同。
- 如果改变的是第一层不可变元素,则赋值的(num_list2)和被赋值的(num_list1)俩者改变都不会影响另一个结果。
- 如果改变的除第一层可变元素中的其他元素(大于第一层):深拷贝下,则赋值的(num_list2)和被赋值的(num_list1)俩者改变都不会影响另一个结果;浅拷贝下,则赋值的(num_list2)和被赋值的(num_list1)俩者改变都会影响另一个结果,都会改变最终的结果。