python中的賦值 值傳遞?
阿新 • • 發佈:2018-11-10
幾行很簡單的程式碼
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 裡的引數是通過賦值傳遞的。