我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么从C++的角度分析PYTHON的深浅拷贝

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么从C++的角度分析PYTHON的深浅拷贝

这篇文章主要讲解了“怎么从C++的角度分析PYTHON的深浅拷贝”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么从C++的角度分析PYTHON的深浅拷贝”吧!

今天看到python的列表深浅拷贝,不由得和C\C++进行了比较如下:

其实python中的深COPY和浅COPY和C\C++中是一样的,毕竟python底层是C/C++做的,这方面保留了
C\C++的原理,对于类或者结构体复制构造函数等号(=)操作符保留了浅COPY,当然我们可以自定义
这些函数。我们先从C++的简单的复制构造函数等号(=)操作符的例子开始

#include<iostream>#include <stdlib.h>#include <string.h>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<<this->a<<"   ";                        cout<<this->b<<endl;                }                void modify(const char* in,const int in2)                {                        if(strlen(a) < strlen(in))                        {                                cout<< "error:much lenth than point a char"<<endl;                                exit(1);                        }                        else                        {                                for(int i=0;i<strlen(in);i++)                                {                                        *(a+i) = *(in+i);                                }                        }                        b = in2;                }};int main(void){        testcy a("123123");        testcy b = a;        testcy c ;        c = a;    cout<<"source data:"<<endl;        cout<<"string  int"<<endl;        a.print();        b.print();        c.print();        cout<<"after only change a:"<<endl;        cout<<"string  int"<<endl;        a.modify("asd",2);        a.print();        b.print();        c.print();}

非常简单就是为了演示浅COPY输出如下:

source data:string  int123123   1123123   1123123   1after only change a:string  intasd123   2asd123   1asd123   1

我们可以看到在修改a的数据后b、c的数据string数据也更改了,但是简单类型int没有更改。那么我们用内存四区图来描述

怎么从C++的角度分析PYTHON的深浅拷贝

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的深浅拷贝这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么从C++的角度分析PYTHON的深浅拷贝

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么从C++的角度分析PYTHON的深浅拷贝

这篇文章主要讲解了“怎么从C++的角度分析PYTHON的深浅拷贝”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么从C++的角度分析PYTHON的深浅拷贝”吧!今天看到python的列表深浅
2023-06-04

C++构造函数的类型,浅拷贝与深拷贝实例分析

本文小编为大家详细介绍“C++构造函数的类型,浅拷贝与深拷贝实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++构造函数的类型,浅拷贝与深拷贝实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、无
2023-06-29

Python中Numpy的深拷贝和浅拷贝怎么使用

这篇“Python中Numpy的深拷贝和浅拷贝怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python中Numpy
2023-06-30

从SEO的角度分析电商网站怎么处理过期页面与内链结构

小编给大家分享一下从SEO的角度分析电商网站怎么处理过期页面与内链结构,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! 所有的电子商务网站都不可能永远长期出售一款产品,随着季节的变化与流行元素的变更,科技的进步,很多电商网站
2023-06-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录