【Python基礎】Pass-by-object

是時候回顧一下Python的函數傳參方式了。python

Python的傳參方式既不是pass-by-value(傳值),也不是pass-by-reference(傳引用),而是pass-by-object。app

Python中每一個object都有"type", 和「identifier」:ide

# int 3
id(3) # this get the identifier
type(3) # this get the type

也有本身的name -- 但object並不知道本身被叫作什麼;一個object能夠被叫作不少不一樣的名字:函數

a = 1
b = 1 # object int 1 is called a, and also b

上面的行爲先將1這個整型命名爲a,將a加入當前的namespace中,而後又將1再次命名爲b,將b加入當前的namespace中。this

a = 1
a = 2

上面先將1命名爲a,將a加入當前的namespace中,又將2命名爲a,替換了以前a所指向的object。在整個過程當中,只是name的指向發生了變化,namespace發生了變化,而object沒有發生變化。spa


Python的object分紅mutable(可變)和immutable(不可變)。可變的object好比字典(dict), 列表(list);不可變的好比元組(tuple),固定字符串(string),整形,長整形,浮點數....code

def func(a):
    # do something on a
    return

當你使用a = 3; func(a)的時候,所傳入的並非a這個name,而是a所指向的object: int 3htm

a = 3
def func(a):
    a = 4
    return 
print(a) # 3

由於int 3不是一個mutable的object,所以在func()中所作的只是在其namespace中將name a指向了object: int 4. 這個改變並不影響func()之外的namespace.對象

然而,若是傳入一個mutable的object,好比一個列表:字符串

a = []
def func(a):
    a.append(1)
    return 
print(a) # [1]

func()中a所指向的object發生了改動,所以當函數返回時,以外的namespace中a所指向的object也發生了改動。

另外,

a = [1, 2, 3]
def func(a):
    a = []
    return 
print(a) # [1, 2, 3]

這種用直接賦值方式改變mutable對象是無效的。須要使用object自帶的各類method,好比列表的.appenda[0] = 1中a[0]其實也是method的語法糖而已。

References:

https://stackoverflow.com/questions/13299427/python-functions-call-by-reference
http://effbot.org/zone/call-by-object.htm
http://effbot.org/zone/python-objects.htm

相關文章
相關標籤/搜索