中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么從C++的角度分析PYTHON的深淺拷貝

發布時間:2021-11-30 16:59:10 來源:億速云 閱讀:150 作者:iii 欄目:開發技術

這篇文章主要講解了“怎么從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  int
123123   1
123123   1
123123   1
after only change a:
string  int
asd123   2
asd123   1
asd123   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的深淺拷貝這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

潮州市| 新宁县| 金溪县| 商洛市| 张北县| 化德县| 西峡县| 漳浦县| 博罗县| 兖州市| 肃宁县| 南部县| 温州市| 新津县| 铜山县| 襄垣县| 昌江| 伊金霍洛旗| 永善县| 永吉县| 巴中市| 六盘水市| 石棉县| 定远县| 洛宁县| 兴仁县| 富民县| 贵南县| 乌审旗| 海门市| 罗城| 江孜县| 理塘县| 广州市| 遂川县| 阿拉善盟| 广平县| 尼勒克县| 自贡市| 襄樊市| 涞源县|