2. python中的引數傳遞
c++中常見的引數傳遞有值傳遞和引用傳遞兩種:
#include using namespace std;
// 交換 2 個變數的值
void swap(int x, int y)
int main ()
before swap, value of a :1
before swap, value of b :2
after swap, value of a :1
after swap, value of b :2
上面的swap()函式使用值傳遞,把a,b的值分別拷貝給x和y,然後再交換x和y的值,故不影響a,b的值。
將上面的swap()函式改為:
void swap(int& x, int& y)
使用引用傳遞後,x和a,y和b指向的就是同一塊記憶體區域,故swap()中交換x,y就是交換a,b。
python中的引數是賦值傳遞(pass by assignment),或者叫物件的引用傳遞(pass by object reference) 。python中的所有資料型別都是物件,所以引數傳遞時,只是讓新變數與原變數指向相同的物件而已。
也就是說,在python中:
def my_func1(b):
b = 2 # b指向了新的記憶體區域
a = 1
my_func1(a)
a***************==
1
以上**,實際上就是兩步:
區域性變數b指向了a,即a,b指向了同乙個記憶體區域,都指向了1
在函式內,b指向了新的記憶體區域,指向了2;a不變
要修改a變數,就只能讓a變數指向新的記憶體區域,即:
def my_func2(b):
b = 2
return b
a = 1
a = my_func2(a)
a********************===
2
def my_func3(l2):
l1 = [1, 2, 3]
my_func3(l1)
l1[1, 2, 3, 4]
以上的**分為兩步:
l2指向了l1
要注意的是,mutable變數的傳遞具體要看函式具體的操作是什麼樣子,因為python函式內部也可以開闢新的記憶體空間,這樣就和immutable變數的情況一樣了。如:
def my_func4(l2):
l2 = l2 + [4]
l1 = [1, 2, 3]
my_func4(l1)
l1[1, 2, 3]
l2 = l2 + [4]
上面的**實際上開闢了新的記憶體空間儲存列表l2原先的內容和列表[4]的內容,然後讓l2指向該新的記憶體區域。這和immutable變數的情形是一樣的操作。如下所示:
def my_func4(l2):
print(f"l2pre_id:")
l2 = l2 + [4]
print(f"l2pos_id:")
l1 = [1, 2, 3]
print(id(l1))
my_func4(l1)
print(l1)
print(id(l1))
*************************=
88012680
l2pre_id:88012680
l2pos_id:87985736
[1, 2, 3]
88012680
Python的函式引數傳遞
原址 我想,這個標題或許是很多初學者的問題。尤其是像我這樣的對c c 比較熟悉,剛剛進入python殿堂的朋友們 c c 的函式引數的傳遞方式根深蒂固的影響這我們的思維 引用?傳值?究竟是那種呢。呵呵,語言的特性決定了是使用的方法,那麼,現在我們來 一下python的函式引數傳遞方式。在開始之前,我...
Python的函式引數傳遞
看兩個例子 a 1 deffun a a 2 fun a print a 1a deffun a fun a print a 1 所有的變數都可以理解是記憶體中乙個物件的 引用 或者,也可以看似c中void 的感覺。a 1 deffun a print func in id a func in 41...
Python的函式引數傳遞
看兩個例子 python a 1 def fun a a 2 fun a print a 1 a 1 def fun a a 2 fun a print a 1 python a def fun a fun a print a 1 所有的變數都可以理解是記憶體中乙個物件的 引用 或者,也可以看似c中...