python語言的參數傳遞是引用傳遞,即被調用函數中修改了形式參數值,調用函數的實際參數值也被改變。函數調用時,調用函數把實參變量的“地址”傳給形參,整個執行期間實參和形參共用同一地址的存儲單元,實參和形參其實就是一個,被調函數對形參的任何操作都等同於對實參的操作,因此實參值會隨着被調用函數的形參值的改變而改變。
python中:對於不可變類型:因變量不能修改,所以運算不會影響到變量自身;
對於可變類型:函數體內的運算有可能會更改傳入的實參值
引用傳參一:
a = 100 # 這里的a是不可變類型 def test(a): a += a # 這個式子有兩層含義:1.這里可能是重新定義一個新的變量a,2.也有可能是修改a的值 # 但由於全局變量a不能修改,所以此處是重新了一個a print("函數內:", a, id(a)) test(a) print("函數外:", a, id(a))
函數內: 200 1572488560
函數外: 100 1572486960
引用傳參二:
a = [100] # 這里的a是一個列表,是可變類型 def test(a): a += a # 由於a是可變類型,所以這里是修改a print("函數內:", a, id(a)) test(a) print("函數外:", a, id(a))
函數內: [100, 100] 20268456
函數外: [100, 100] 20268456
引用傳參三:
a = 100 # 這里的a是不可變類型 def test(a): a = a + a # 最初為了好理解,所以可以認為a+=a等價於a=a+a,所以這里同引用傳參一 print("函數內:", a) test(a) print("函數外:", a)
函數內: 200
函數外: 100
引用傳參四:
a = [100] # 這里的a是一個列表,是可變類型 def test(a): a = a + a #對於這種情況,等號左邊的a是重新定義的一個量,此時a=a+a與a+=a不一樣 # 1.先算=右邊的 # 2.算出來的結果是[100100] # 3.a=[100,100] # 4.讓a變量指向了[100,100],即a保存的是【100,100】的引用(內存地址) print("函數內:", a) test(a) print("函數外:", a)
函數內: [100, 100]
函數外: [100]
