第一段程式碼:
## -*- coding:gb2312 -*-
a = [100]
def test(num):
num += num #第一段代码
print(num)
test(a)
print(a)
執行結果:
##第二段程式碼:
## -*- coding:gb2312 -*-
a = [100]
def test(num):
num = num + num #这个地方改了一下
print(num)
test(a)
print(a)
執行結果:
##我的問題:
num = num不應該直接等價於mun = num num 麼
為什麼算出來結果卻是不一樣的?這個是什麼情況
你可以嘗試進行這樣的操作,
透過id()這個函數可以得到變數所分配的記憶體位址。透過實驗發現使用了
+
的變數位址發生了變化,也就是你所說的num+=num與num=num+num不等價。但是,當做如下騷操作時候又會發現啪啪啪打臉
分配的位址似乎一直在改變。
原因在於,Python中的資料結構分為可變(mutable)和不可變(immutable)。
對於可變類型,=和+=有著明顯的不同,如上面的list:
+表示連接操作,+=表示追加
對於不可變類型,=和+=就是一樣的操作,如上面的tuple
可變類型與不可變類型的本質在於記憶體空間是否可變~
首先看出差別在於
可以看出分別呼叫的方法不同,分別是__add__,__iadd__
加法運算子會計算出新的object來賦值給num
增量賦值運算子修改原來的引用
參考這裡: https://stackoverflow.com/que...
Remember that arguments are passed by assignment in Python.
傳參數在python是用assignment 不是reference,所以你傳a過去函數時傳的是a的值,而不是a本身。若要改動a本身就需要用return傳值回來
結果:
在python中,a=a+b是先建立一個新的物件並讓變數a引用這個對象,a+=b是讓a所引用的物件的值變成a+b的值