说明:

今天看到一个小题,然后就好奇的做了一下。

问题: 有四个数字: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、总结

  1. 深拷贝deepcopy相当于复制一份,浅拷贝copy相当于引用,但是id都不相同。
  2. 如果改变的是第一层不可变元素,则赋值的(num_list2)和被赋值的(num_list1)俩者改变都不会影响另一个结果。
  3. 如果改变的除第一层可变元素中的其他元素(大于第一层):深拷贝下,则赋值的(num_list2)和被赋值的(num_list1)俩者改变都不会影响另一个结果;浅拷贝下,则赋值的(num_list2)和被赋值的(num_list1)俩者改变都会影响另一个结果,都会改变最终的结果。