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

时间:2013-12-19 21:25:10

标签: python list

我在尝试使用p= p+ip += i不同的列表时注意到了 例如:

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

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

但如果我将p = p + test1p += test1切换为以下

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

p += test1

print test

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

不同价值的原因是什么?

3 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:1)

tobias_k已经解释过了。

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

从上面链接的answer引用它:

  

在执行foo + =某事时你正在修改列表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

答案 2 :(得分:1)

++=分别代表两个不同的运算符addiadd

来自http://docs.python.org/2/reference/datamodel.html#object.iadd:方法 iadd (自我,其他)等

  

调用这些方法来实现增强算法   赋值(+ =, - =, =,/ =,// =,%=,* =,<< =,>> =,& =,^ =,| =)。   这些方法应该尝试就地进行操作(修改   自我)并返回结果

p += test1使用iadd运算符,因此会更改p的值,而p = p + test1使用不会修改任何两个操作数的add