Python函式的引數傳遞

2021-09-25 12:55:25 字數 1901 閱讀 7825

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中...