python 共享傳參
人們談到Python的傳參方式,常常會說:參數按值傳遞,但這裏的值是引用。在C語言中,按值傳遞指的是函數得到的是參數的副本;而按照引用傳遞指的是函數得到的是參數的指針。
在Python中,函數得到的是參數的副本,但參數使用是引用。如果參數引用的是可變對象,那麼對象可能會被修改,但是對象的標識不變。此外,因爲函數得到的是參 數引用的副本,所以重新綁定對函數外部沒有影響。
這樣說來,Python的傳參方式稱爲共享傳參更爲合適
基於這種特性,Python不推薦,在函數參數中使用可變對象作爲參數的默認值
Python Tutor,交互式網站,可以查看變量的引用動畫
class SB:
"""
這種寫法不太完善,最好判斷一下參數類型,否則會出現意想不到的驚喜
"""
def __init__(self, passengers=None):
if passengers is None:
self.passengers = []
else:
self.passengers = list(passengers)
# 和下面這種形式等價
# self.passengers = copy.deepcopy(passengers)
class SBB:
def __init__(self, passengers=None):
if passengers is None:
self.passengers = []
else:
self.passengers = passengers
# 在控制檯中
ist = [1,2,3,4]
sb = SB(ist)
sbb = SBB(ist)
sb.passengers is ist
# False
sbb.passengers is ist
# True
ist.append(5)
ist
# [1, 2, 3, 4, 5]
sbb.passengers
# [1, 2, 3, 4, 5]
sb.passengers
# [1, 2, 3, 4]