關於Python函式引數傳遞方式--值傳遞?引用傳遞!
阿新 • • 發佈:2019-02-14
渣渣我在學習中遇到的一點問題,特地貼出來,由於我水平渣,所以如有問題,請多指教
經過測試可以發現: python3 不允許我們選擇引數傳遞方式,但是他已經全部採用了引用傳遞。有幾點需要注意:
1.引用傳遞可以當做值傳遞使用,只是你需要把他賦值給一個臨時變數副本,不要直接使用引用傳遞過來的引數。例如:使用x的副本y.(這裡其實相當於我們替代系統進行了值傳遞操作)
def test(x):
y = x
print y+1
2.引用傳遞過來的物件其屬性不變。引用傳遞過來的物件其屬性不變。引用傳遞過來的物件其屬性不變。
這也就是說,他原來可以更改,那麼傳遞後也可以更改,同理,原先不可改現在也不可改。(這解釋了其他巨巨關於不可變物件所說的“值傳遞”)
有時你會發現怎麼貌似引用傳遞失效,其實主要原因是因為你的一些操作導致該變數在函式中地址發生了改變,而函式外仍使用舊地址。
例如:
def testplace0(dt): print id(dt) dt["A"] = 1 #dt[0].append(dt) print "不重置dt",id(dt) def testplace1(dt): print id(dt) dt={} dt["A"] = 1 #dt[0].append(111) print "重置dt",id(dt) #dt =([1,5,3],1,3) dt={} print id(dt) testplace0(dt) testplace1(dt) print "最終",id(dt)
結果:
109911328
109911328
不重置dt 109911328
109911328
重置dt 109886320
最終 109911328
4.一些賦值操作預設可能是地址賦值,所以要注意使用的方式。例如:
a=[1,2,3,4]
b=a #地址賦值
b=a[:]#內容賦值
的引數。