重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要讲解了“怎么从C++的角度分析PYTHON的深浅拷贝”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么从C++的角度分析PYTHON的深浅拷贝”吧!
站在用户的角度思考问题,与客户深入沟通,找到东城网站设计与东城网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:做网站、成都网站建设、企业官网、英文网站、手机端网站、网站推广、主机域名、虚拟主机、企业邮箱。业务覆盖东城地区。其实python中的深COPY和浅COPY和C\C++中是一样的,毕竟python底层是C/C++做的,这方面保留了
C\C++的原理,对于类或者结构体复制构造函数等号(=)操作符保留了浅COPY,当然我们可以自定义
这些函数。我们先从C++的简单的复制构造函数等号(=)操作符的例子开始
#include#include #include using namespace std; class testcy { private: char* a; unsigned int b; public: testcy(const char* inc) { a = new char[strlen(inc)+1]; strcpy(a,inc); b = 1; } testcy() { a= NULL; b = 0; } testcy(const testcy &in) //浅copy 构造函数 { this->a = in.a; this->b = in.b; } testcy& operator=(const testcy& in)//浅=值操作符重载 { this->a = in.a; this->b = in.b; } void print() { cout< a<<" "; cout< b< 非常简单就是为了演示浅COPY输出如下:
source data: string int 123123 1 123123 1 123123 1 after only change a: string int asd123 2 asd123 1 asd123 1我们可以看到在修改a的数据后b、c的数据string数据也更改了,但是简单类型int没有更改。那么我们用内存四区图来描述
123.jpg
图中a->a当然就是整形,但是a->b是指针其指针的值0XB0120存在栈中但是实际指向的数据存在堆中,
而变量b->b,c->b指向了同一块内存 导致一改全部都改了,但是a->a,b->a,c->a确实单独的在栈上了的
没影响。其实这里我们只要修改浅COPY为深COPY改变其实现即可比如testcy(const testcy &in) //深copy 构造函数 { this->a = new char[strlen(in.a)+1]; strcpy(this->a,in.a); this->b = in.b; }我们要做的不仅仅是要指针相等而是要将内存重新分配。注意本测试程序没有写析构函数。
下面我们来看看python的浅列表拷贝
import copy a = ['t1','t2','t3','t4'] b = a print("source data") print(a); print(b); a[0] = 'gao' print("after change:") print(a); print(b);source data ['t1', 't2', 't3', 't4'] ['t1', 't2', 't3', 't4'] after change: ['gao', 't2', 't3', 't4'] ['gao', 't2', 't3', 't4']确实如此,修改了列表元素a[0]的值b列表也修改了,我们有了C++的那张图这个就很好理解了,他们是
指向同一块内存堆区。我们应该使用a = ['t1','t2','t3','t4'] b = copy.deepcopy(a)从这个方法的命名我们也可以看到这是深copy,其原理已经在C++代码进行了剖析
另外如下:a = [['t1','t10'],'t2','t3','t4'] b = a.copy() print("source data") print(a); print(b); a[0][0] = 'gao' print("after change:") print(a); print(b);source data [['t1', 't10'], 't2', 't3', 't4'] [['t1', 't10'], 't2', 't3', 't4'] after change: [['gao', 't10'], 't2', 't3', 't4'] [['gao', 't10'], 't2', 't3', 't4']a.copy()只是对第一层进行copy,第二层在python里面实现应该也是指针或者引用,一样的会出问题。
所以copy的时候我们尽量使用copy.deepcopy(a)来得到正确的数据当然根据实际需求定。
可以看到C/C++是理论基础,有了这些理论PYTHON中的很多现象很好理解。感谢各位的阅读,以上就是“怎么从C++的角度分析PYTHON的深浅拷贝”的内容了,经过本文的学习后,相信大家对怎么从C++的角度分析PYTHON的深浅拷贝这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!
当前标题:怎么从C++的角度分析PYTHON的深浅拷贝-创新互联
本文URL:http://cqcxhl.cn/article/dphjoh.html