『Python × C++』函数传参机制学习以及对比
生活随笔
收集整理的這篇文章主要介紹了
『Python × C++』函数传参机制学习以及对比
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、Python函數傳參
在python中,函數傳參實際上傳入的是變量的別名,由于python內在的變量機制(名稱和變量值相互獨立),只要傳入的變量不可變(tuple中的元素也要是不可變的才行),那么函數體內是無法直接修改傳入的變量的。
假如我們把v=1傳入函數體f(v1),實際就是新增了v1變量名,它和v同時指向1這個對象,如果我們在函數內部試圖修改v1,由于整形是不可變的,實際上會創建一個新的對象,將v1指向新的對象,如果v指向的是可變對象,則內部對于其的修改會體現在外部上,這也是推薦tuple的原因之一。
另外,在python的局部作用域中,能夠修改的對象必須是聲明了的局部作用變量或者顯示使用global聲明的全局變量(其實使用nonlocal聲明的自由變量也行),只要不修改值,單純的讀取的話,直接就可以讀取全局變量,效果如下,嘗試修改a時會報錯,如果聲明一下就可以避免:
二、C++中的函數傳參
相比python,C++要靈活的太多,其參數傳入有三種:
下面程序是傳入副本與傳入指針的對比:
#include <iostream> using namespace std;void myswap_pass_by_reference(int a, int b) {int t = a;a = b;b = t; }void myswap_pass_by_pointer_value(int* a, int* b) {cout << *a << " " << *b << endl;int t = *a;*a = *b;*b = t;cout << *a << " " << *b << endl; }int main() {int a = 1, b = 2;cout << "originally" << endl;cout << "a=" << a << ", b=" << b << endl;myswap_pass_by_reference(a, b);cout << "after myswap_pass_by_reference" << endl;cout << "a=" << a << ", b=" << b << endl;myswap_pass_by_pointer_value(&a, &b);cout << "after myswap_pass_by_pointer_value" << endl;cout << "a=" << a << ", b=" << b << endl;return 0;}?
下面程序是傳入引用和傳入指針的對比:
#include <iostream> using namespace std;void myswap_pass_by_reference(int& a, int& b) {int t = a;a = b;b = t; }void myswap_pass_by_pointer_value(int* a, int* b) {cout << *a << " " << *b << endl;int t = *a;*a = *b;*b = t;cout << *a << " " << *b << endl; }int main() {int a = 1, b = 2;cout << "originally" << endl;cout << "a=" << a << ", b=" << b << endl;myswap_pass_by_reference(a, b);cout << "after myswap_pass_by_reference" << endl;cout << "a=" << a << ", b=" << b << endl;myswap_pass_by_pointer_value(&a, &b);cout << "after myswap_pass_by_pointer_value" << endl;cout << "a=" << a << ", b=" << b << endl;return 0;}可以看到,在調用了引用方式函數后,兩個變量的值交換了次序。
?
總結
以上是生活随笔為你收集整理的『Python × C++』函数传参机制学习以及对比的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Springboot——HelloWor
- 下一篇: JAVA原生mvc实现用户信息的增删查改