亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

Python與C++引用的示例分析

發布時間:2021-10-25 17:47:10 來源:億速云 閱讀:140 作者:柒染 欄目:編程語言

本篇文章給大家分享的是有關Python與C++引用的示例分析,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

在用Python寫建二叉樹的代碼的時候遇到了這個問題,原因就是把Python的“引用”與C++的“引用”搞混了,這兩種語言中都有“引用”名詞,雖然大部分時候很像,其實還是有區別的。這里記錄一下,注意,這里只是我自己的一點個人理解,在找到更好的理解之前,先這樣理解吧!

例子,這是我的兩段根據先序序列創建二叉樹的代碼:

# 正確
pos = 0
def create(seq):
    global pos
    ch = seq[pos]
    pos += 1
    if ch == '#':
        return None
    else:
        temp = TreeNode(ch)
        temp.left = create(seq)
        temp.right = create(seq)
        return temp
 
seq = "abd###ce###"
root = create(seq)

還有這個:

# 錯誤
def create(root):
    global pos
    if(seq[pos]=='#'):
        root = None
        pos += 1
        return
    root = TreeNode(seq[pos])
    pos += 1
    root.left = None
    root.right = None
    create(root.left)
    create(root.right)

看起來只是有無返回值的區別,實際上第二段代碼是錯誤的,其實從第二段代碼的思路來說,在C++里面可以這樣寫:

void create(tree & t){
    char ch = str[pos++];
    if(ch=='#'){
        t = NULL;
        return;
    }
    t = new node;
    t->val = ch;
    create(t->left);
    create(t->right);
}

這就是Python中與C++的引用的區別了。
我是這樣理解的:Python中對內存的使用更像是不可改變的,對于一個引用所指向的對象,如果我要修改值,那么會先新找一塊內存,賦值,然后將引用指向這個新的內存塊,這樣就是修改了引用指向的位置,但是在C++中則是直接在引用所指向的內存塊上改變,例如:

Python:
a = 1
print(id(a))
a = a+1
print(id(a))
# 輸出
140708803374848
140708803374880

在C++中:

int t = 1;
int & a = t;
printf("%d    %d\n", &a, a);
a += 1;
printf("%d    %d\n", &a, a);
# 輸出
7208712    1
7208712    2

所以,就像上面的第二段代碼,我傳入了創建的樹根的引用,但是當樹的結構發生改變的時候,實際上是改變了存儲的位置,這樣原本的函數外面創建的root引用指向的其實還是原來的空內存塊(突然覺得好傻。。就像被偷光了,還在等一樣。。。),但是C++的引用就是很倔強地只認那一塊內存,所以就可以直接改變使用了。
關于Python中引用與對象的關系,還牽扯到一些內存之類的知識,例如:

a = 1
b = 1
print(id(a))
print(id(b))
# 輸出
140708803374848
140708803374848

這里是因為Python中為了節省內存,會將一些短小的字符串以及數字進行緩存,這樣就會節省這類對象的建立銷毀的開銷了。
其它的就還有關于可變數據對象(mutable)和不可變對象(immutable)了,這個我之前也記錄過。總有些語言看起來很簡單,但是實際上還是要好好理解的啊。

以上就是Python與C++引用的示例分析,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

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

AI

安乡县| 石河子市| 望都县| 乐业县| 灵武市| 壤塘县| 漠河县| 酒泉市| 黑山县| 和硕县| 峨山| 通辽市| 滨海县| 新和县| 双辽市| 民和| 天津市| 隆昌县| 济宁市| 平阳县| 信宜市| 金坛市| 嘉峪关市| 沂南县| 甘洛县| 桃园市| 崇明县| 简阳市| 皮山县| 唐海县| 桐柏县| 和政县| 和平县| 法库县| 松江区| 辰溪县| 乐山市| 德令哈市| 同仁县| 南安市| 苏尼特左旗|