C和Python中简单变量的拷贝问题
所谓浅拷贝,即变量之间的差异只体现在声明的名称上,他们实质上指向同一块内存地址;而深拷贝则是内存地址完全不相同的两个变量。
在C中(包括C++,CUDA),两个值相同的变量内存地址是不同的,而在python中则不太一样,下面我们通过几个例子了解一下python中浅拷贝和深拷贝问题。
C
用代码说话。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18int a = 1;
int b = 1;
printf("addr of a = %p\n", &a);
printf("addr of b = %p\n", &b);
a = 2;
printf("addr of a = %p\n", &a);
printf("addr of b = %p\n", &b);
b = 2;
printf("addr of a = %p\n", &a);
printf("addr of b = %p\n", &b);
[usr]./test_shallowcopy_ofC.out
addr of a = 0x7ffdb8b0344c
addr of b = 0x7ffdb8b03448
addr of a = 0x7ffdb8b0344c
addr of b = 0x7ffdb8b03448
addr of a = 0x7ffdb8b0344c
addr of b = 0x7ffdb8b03448
// 整个过程中a,b的地址并没有发生改变
Python
简单变量
用代码说话。
1 | # copypy.py |
列表
所以,当使用直接赋值的方式b = a进行变量值的传递时可能会出现问题,当两个变量只是简单的两个数值时似乎并没有什么不同,我们再看以下例子。
1 | # test_copylist.py |
这显然不是我们想看到结果,如果要实现C中赋值的效果(深拷贝),就需要用到copy模块,模块中有copy.copy()和copy.deepcopy()两个函数,我们看一下使用方法:
1 | # test_copylist2.py |
总结
如果想要实现C中的拷贝效果,即字面意义上的变量赋值,需要使用y=copy.deepcopy(x)(后续x的变化不会改变y的值)。