用+和+= 在python中添加列表的区别

difference between adding lists in python with + and +=

本问题已经有最佳答案,请猛点这里访问。

我在用列表进行试验时注意到,p= p+ip += i不同。例如:

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

在上述代码中,test[0, 1, 2, 3,]的原值打印。

但如果我用p += test1切换p = p + test1如下

1
2
3
4
5
6
7
test = [0, 1, 2, 3,]
p = test
test1 = [8]

p += test1

print test

test现在等于[0, 1, 2, 3, 8]

不同价值的原因是什么?


p = p + test1为变量p赋值,而p += test1扩展了存储在变量p中的列表。由于p中的列表与test中的列表相同,因此在p中附加的列表也附加到test中,而在为变量p分配新值时,不会以任何方式改变分配给test的值。


++=分别代表两种不同的运算符,分别是addiadd

来自http://docs.python.org/2/reference/datamodel.html object.iadd:方法iadd(self,other)等

These methods are called to implement the augmented arithmetic
assignments (+=, -=, =, /=, //=, %=, *=, <<=, >>=, &=, ^=, |=).
These methods should attempt to do the operation in-place (modifying
self) and return the result

p += test1使用iadd操作符,从而改变p的值,而p = p + test1使用add操作符,它不修改两个操作数中的任何一个。


托比亚斯·库克已经解释过了。

简而言之,使用+而不是+=直接更改对象,而不是指向对象的引用。

从上面链接的答案中引用:

When doing foo += something you're modifying the list foo in place,
thus you don't change the reference that the name foo points to, but
you're changing the list object directly. With foo = foo + something,
you're actually creating a new list.

以下是发生这种情况的示例:

1
2
3
4
5
6
7
8
9
10
11
12
>>> alist = [1,2]
>>> id(alist)
4498187832
>>> alist.append(3)
>>> id(alist)
4498187832
>>> alist += [4]
>>> id(alist)
4498187832
>>> alist = alist + [5]
>>> id(alist)
4498295984

在您的例子中,测试被更改,因为p是对测试的引用。

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