>>> l = []
>>> id(l)
13043192
>>> l += [3]
>>> id(l)
13043192
>>> l = l + [3]
>>> id(l)
13059216
不用太糾結,直接看記憶體位址就一目了然。
id是python內建函數,what's id? ...
《'id' is a bad variable name in Python》
id() is a fundamental built-in:
Help on built-in function id in module builtin:
id(...)
id(object) -> integer
Return the identity of an object. This is guaranteed to be unique among
simultaneously existing objects. (Hint: it's the object's memory
address.)
這裡樓主有些誤解啊,i += x,這是一種語法糖,真正的展開後的樣子是啥樣子呢?
在c語言裡, i += x 的真實的樣子是 i = i+x, 這裡i是被重新賦值了,那麼i的指標位址會變的.
但Python裡不是這樣子的,i += x 的真實樣子是 i.extend(x), 這裡i的指針位址沒變,只是i的值被改變了而已。
refer:http://stackoverflow.com/questions/2347265/why-does-behave-unexpectedly-on-lists
thank to : @WKPlus
看看下面兩段程式碼的比較:
代碼1:
代碼2:
具體的解釋看這裡:http://stackoverflow.com/questions/2347265/why-does-behave-unexpectedly-on-lists
很明顯,就像2樓所說。
代碼1 l2 = l1,l2 += [4],操作的都是l1,類似指針,引用神馬的,理解不了就這麼想就可以了。
代碼2 l2 = l1,l2 = l2 + [4],這很明顯是對l2進行重新賦值。你可以這樣寫l3 = l2 + [4],l2 += [4]。然後就知道結果了。
python的深拷貝和淺拷貝,可以了解一下
2樓stackoverflow裡面有一個很不錯的答案,直接用id()看記憶體位址
不用太糾結,直接看記憶體位址就一目了然。
id是python內建函數,what's id? ...
《'id' is a bad variable name in Python》
id() is a fundamental built-in:
Help on built-in function id in module builtin:
能想到的就是某些類別實現了
__iadd__
且跟__add__
行為不一樣,list 的+=
就是一個例子,普通+
會回傳一個新的list 實例,而+=
是直接操作list 本身。如果能確定
i
、x
就是兩個數,說i += x
會出問題那就是有些吹毛求疵、教條主義了。主要看i ,如果i是表達式
i+=x 中i 只計算一次
i = i+x i要計算2次
那麼,如果i表達式中有修改變量, i = i+x 中兩個i的值可能是不同的
這個範例在各種文法書裡應該比較常見
以上是針對引用型別的,值型別應該是沒有差別的吧。
核心問題就是要防止副作用。讓程式碼的行為一致。
這裡樓主有些誤解啊,i += x,這是一種語法糖,真正的展開後的樣子是啥樣子呢?
在c語言裡, i += x 的真實的樣子是 i = i+x, 這裡i是被重新賦值了,那麼i的指標位址會變的.
但Python裡不是這樣子的,i += x 的真實樣子是 i.extend(x), 這裡i的指針位址沒變,只是i的值被改變了而已。
refer:http://stackoverflow.com/questions/2347265/why-does-behave-unexpectedly-on-lists
thank to : @WKPlus
4樓說的太對了,兩個不同文件的MD5值還有幾率相同呢,問題是你碰見過麼。