Python中函數參數是引用傳遞(注意不是值傳遞)。對於不可變類型,因變
量不能修改,所以運算不會影響到變量自身;而對於可變類型來說,函數體
中的運算有可能會更改傳入的參數變量。
引用傳參一:
>>> a = 100 #這里的a是不可變類型 >>> def test(a): ... a+=a #這個式子有兩層含義:1.這里可能是重新定義一個新的變量a,2.也有可能是修改a的值,但由於全局 #變量a不能修改,所以此處是重新定義了一個a; ... print("函數內:%d"%a) ... >>> test(a) 函數內:200 >>> print(a) 100
引用傳參二:
>>> a = [100] #這里的a是一個列表,是可變類型 >>> def test(a): ... a+=a #由於列表a是可變類型,所以這里是修改a ... print("函數內:") ... print(a) ... >>> test(a) 函數內: [100, 100] >>> print(a) [100, 100]
引用傳參三:
>>> a = 100 >>> def test(a): ... a=a+a #最初為了好理解,所以可以認為a+=a等價於a=a+a,所以這里同引用傳參一 ... print("函數內:%d"%a) ... >>> test(a) 函數內:200 >>> print(a) 100
引用傳參四:
>>> a = [100] >>> def test(a): #1. 先算 =號右邊的 #2. 算出來的結果是[100,100] #3. a = [100,100] #4. 讓a變量指向了[100,100],即a保存的是[100,100]的引用(內存地址) ... a=a+a #對於這種情況,等號左邊的a是重新定義的一個量,此時a=a+a與a+=a不一樣 ... print("函數內:") ... print(a) ... >>> test(a) 函數內: [100, 100] >>> print(a) [100]
事實上,我們可以通過打印相應變量的地址來幫助我們理解,例如:
a是int類型的情況:
a是列表的情況: