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)了,這個我之前也記錄過。總有些語言看起來很簡單,但是實際上還是要好好理解的啊。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2639538/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 深入分析C++引用C++
- C++左值引用與右值引用C++
- c++ 左值引用與右值引用C++
- C++中指標與引用詳解C++指標
- C++ 引用C++
- 【C++】引用C++
- c++指標傳遞與引用傳遞C++指標
- C++中const與指標、引用的總結C++指標
- C++與Rust引用外部符號的比較C++Rust符號
- C++ 右值引用和左值引用C++
- C++右值引用C++
- 詳解C++引用C++
- c++筆記_引用C++筆記
- python中怎樣封裝與引用Python封裝
- 強引用、軟引用、弱引用與虛引用
- 119 C++中的引用&C++
- C++的引用技術C++
- Python裡的引用與拷貝規律Python
- python-引用Python
- 開心檔之C++ 引用C++
- C++引用型別詳解C++型別
- C++ 引用型別簡介C++型別
- C++引用全部知識點C++
- C++ 預設引數與引用傳遞:語法、用法及示例C++
- C++智慧指標之shared_ptr與右值引用(詳細)C++指標
- Python 列表切片陷阱:引用、複製與深複製Python
- Rust引用自定義c/c++庫RustC++
- 【C++】兩個類的相互引用C++
- C++ 左值引用和右值引用之間的轉換C++
- java的引用:用C++/C的引用和指標去理解JavaC++指標
- Python與C/C++呼叫之ctypesPythonC++
- 分析ThreadLocal的弱引用與記憶體洩漏問題thread記憶體
- C++中的&引用符號全解C++符號
- C++ :引用計數(reference count) 實現C++
- c++ 類的函式引用 指標C++函式指標
- c++中指標和引用的區別?C++指標
- C++精進之路4:引用的用法C++
- 03_方法引用與構造器引用