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

朝陽ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
例子,這是我的兩段根據(jù)先序序列創(chuàng)建二叉樹的代碼:
# 正確
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)
還有這個(gè):
# 錯(cuò)誤
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)
看起來只是有無返回值的區(qū)別,實(shí)際上第二段代碼是錯(cuò)誤的,其實(shí)從第二段代碼的思路來說,在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++的引用的區(qū)別了。 我是這樣理解的:Python中對(duì)內(nèi)存的使用更像是不可改變的,對(duì)于一個(gè)引用所指向的對(duì)象,如果我要修改值,那么會(huì)先新找一塊內(nèi)存,賦值,然后將引用指向這個(gè)新的內(nèi)存塊,這樣就是修改了引用指向的位置,但是在C++中則是直接在引用所指向的內(nèi)存塊上改變,例如:
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
所以,就像上面的第二段代碼,我傳入了創(chuàng)建的樹根的引用,但是當(dāng)樹的結(jié)構(gòu)發(fā)生改變的時(shí)候,實(shí)際上是改變了存儲(chǔ)的位置,這樣原本的函數(shù)外面創(chuàng)建的root引用指向的其實(shí)還是原來的空內(nèi)存塊(突然覺得好傻。。就像被偷光了,還在等一樣。。。),但是C++的引用就是很倔強(qiáng)地只認(rèn)那一塊內(nèi)存,所以就可以直接改變使用了。 關(guān)于Python中引用與對(duì)象的關(guān)系,還牽扯到一些內(nèi)存之類的知識(shí),例如:
a = 1
b = 1
print(id(a))
print(id(b))
# 輸出
140708803374848
140708803374848
這里是因?yàn)镻ython中為了節(jié)省內(nèi)存,會(huì)將一些短小的字符串以及數(shù)字進(jìn)行緩存,這樣就會(huì)節(jié)省這類對(duì)象的建立銷毀的開銷了。 其它的就還有關(guān)于可變數(shù)據(jù)對(duì)象(mutable)和不可變對(duì)象(immutable)了,這個(gè)我之前也記錄過??傆行┱Z言看起來很簡(jiǎn)單,但是實(shí)際上還是要好好理解的啊。
新聞名稱:詳解Python與C++引用
分享URL:http://m.fisionsoft.com.cn/article/djhopio.html


咨詢
建站咨詢
