我在尝试使用p= p+i
与p += i
不同的列表时注意到了
例如:
test = [0, 1, 2, 3,]
p = test
test1 = [8]
p = p + test1
print test
在上面的代码test
中打印出原始值[0, 1, 2, 3,]
但如果我将p = p + test1
与p += test1
切换为以下
test = [0, 1, 2, 3,]
p = test
test1 = [8]
p += test1
print test
test
现在等于[0, 1, 2, 3, 8]
不同价值的原因是什么?
答案 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)
+
和+=
分别代表两个不同的运算符add
和iadd
来自http://docs.python.org/2/reference/datamodel.html#object.iadd:方法 iadd (自我,其他)等
调用这些方法来实现增强算法 赋值(+ =, - =, =,/ =,// =,%=,* =,<< =,>> =,& =,^ =,| =)。 这些方法应该尝试就地进行操作(修改 自我)并返回结果
p += test1
使用iadd
运算符,因此会更改p
的值,而p = p + test1
使用不会修改任何两个操作数的add
。