2013-12-19 14 views
9

我已經與列出該實驗是p= p+i不同然後p += i 例如,當注意到:差和+ =

test = [0, 1, 2, 3,] 
p = test 
test1 = [8] 
p = p + test1 
print test 

在上面的代碼test打印出到原始值的[0, 1, 2, 3,]

但是,如果我在下面

test = [0, 1, 2, 3,] 
p = test 
test1 = [8] 

p += test1 

print test 
切換 p = p + test1p += test1作爲

test現在等於[0, 1, 2, 3, 8]

不同值的原因是什麼?

+2

以下是對此的深入解答:http://stackoverflow.com/questions/2347265/what-does-plus-equals-do-in-python –

+0

參見http://stackoverflow.com/a/ 4773111/2314737和http://stackoverflow.com/a/2027311/2314737 – user2314737

+0

另請參見[在列表中組合元素:看起來像python以兩種不同的方式處理相同的項目,我不知道爲什麼](http:// stackoverflow.com/q/17240162)和[Python是什麼時候「i + = x」與「i = i + x」不同?](http://stackoverflow.com/q/15376509) –

回答

11

p = p + test1分配一個新的值,以可變p,而p += test1延伸存儲在變量p列表。並且由於p中的列表與test中的列表相同,因此附加到p也會附加到test,而將新值分配給變量p不會以任何方式更改分配給test的值。

1

tobias_k已經解釋了。

簡而言之,使用+而不是+ =直接改變對象,而不是指向它的引用。

從上面鏈接的answer引用它:

做當富+ =東西,你正在修改的列表FOO到位, 所以你不更改參考該名稱FOO點,但是 你直接改變列表對象。用foo = foo +的東西, 你實際上正在創建一個新的列表。

下面是一個例子發生這種情況:

>>> alist = [1,2] 
>>> id(alist) 
4498187832 
>>> alist.append(3) 
>>> id(alist) 
4498187832 
>>> alist += [4] 
>>> id(alist) 
4498187832 
>>> alist = alist + [5] 
>>> id(alist) 
4498295984 

在你的情況下,由於p在測試基準測試得到了改變。

>>> test = [1,2,3,4,] 
>>> p = test 
>>> id(test) 
4498187832 
>>> id(p) 
4498187832 
1

++=代表兩個不同的運營商,分別addiadd

http://docs.python.org/2/reference/datamodel.html#object.iadd:方法IADD(個體,其他)等

這些方法稱爲實施增量算術 賦值(+ =, - =,=,/ =,// =,%=,* =, < < =,>> =,& =,^ =,| =)。 這些方法應該嘗試做了手術就地(修改 個體經營)並返回結果

p += test1使用iadd操作,從而改變了p價值,同時p = p + test1使用add不修改任何兩個操作數。