1. 程式人生 > >python中的賦值 值傳遞?

python中的賦值 值傳遞?

幾行很簡單的程式碼

def func(m):
    m[0] = 10
    m = [100,200,300]
    return m

m = [1,2,3]
func(m)
print(m)

猜測這個輸出是什麼呢?

A.【1,2,3】
B.【10,2,3】
C.【100,200,300】

乍一看,我還以為是選C,m不是被重新賦值了嗎!but,執行後,證明我是錯的
控制檯輸出的是B

為什麼是B呢?
我加幾行程式碼幫助理解

def func(m):
    print(id(m))
    m[0] = 10
    print(id(m))
    m = [100,200,300]
    print(id(m))
    return m

m = [1,2,3]
print(id(m))
func(m)
print(m)

執行程式碼,輸出如下

36446536
36446536
36446536
36552392
[10, 2, 3]

在第一個和第二個print可以表明傳遞進來的物件是同一個36446536,經過賦值m[0]=10後,物件還是36446536,
在第四個print表明,此時的m已經不是傳進來的那個“m”了

這個情況呢,用記憶體模型的角度來解釋,就很好理解
這裡寫圖片描述
1.先定義m=[1,2,3],有一個棧變數m和堆【1,2,3】,棧變數m指向堆【1,2,3】
2.呼叫func(m),則在棧裡,多一個“偽m”也指向堆【1,2,3】
3.執行m=[100,200,300],則“偽m”修改指向偽堆【100,200,300】
但是呢,這樣理解是不對的,因為python裡只有值傳遞,按照上述記憶體模型的方式理解,則變成了引用傳遞了,but,如果按照值傳遞的思路,那如何解釋前兩次print(id)都是同一個36446536呢?

引用官方的原話:

Remember that arguments are passed by assignment in Python.
要記住,Python 裡的引數是通過賦值傳遞的。