Python中 “i += x”和“i = i + x”什么时候不等【面试题详解】

今天爱分享给大家带来Python中 “i += x”和“i = i + x”什么时候不等【面试题详解】,希望能够帮助到大家。
这完全取决于i这个对象。

+=调用了__iadd__方法(如果存在—不存在就退一步调用__add__),然而+调用__add__方法^1

从一个API的角度,__iadd__期望被使用在恰当的位置修改易变的对象(返回的对象也是转变后的),而__add__应该返回某些东西的一个新的实例。对于不可变对象,两种方法都返回新的实例,但__iadd__会把新的实例放在和旧实例名字相同的命名空间里。这就是为什么


i = 1
i += 1


看上去增量i,实际上,你得到了一个新的数值,并且转移到了i的最上面—丢掉了旧的数值的引用。在这种情况下,i += 1和i = i + 1是完全一样的。但是,对于大多数可变对象,这是完全不同的:

一个具体的例子:


a = [1, 2, 3]
b = a
b += [1, 2, 3]
print a  #[1, 2, 3, 1, 2, 3]
print b  #[1, 2, 3, 1, 2, 3]


对比一下:


a = [1, 2, 3]
b = a
b = b + [1, 2, 3]
print a #[1, 2, 3]
print b #[1, 2, 3, 1, 2, 3]


注意第一个例子,从b和a代表相同的对象开始,当我对b使用+=,实际上它改变了b(a看起来也改变了- -毕竟他们代表同一个列表)。但是在第二个例子里,当我进行b = b + [1, 2, 3]操作时,b被引用并且和一个新的列表[1, 2, 3]联系了起来。之后在b的命名空间保存了这个关联的列表- -不考虑b之前的序列。

人已赞赏
Python

range() 与xrange()如何选择【面试题详解】

2020-12-22 17:48:10

Python

为什么是string.join(list)而不是list.join(string)【面试题详解】

2020-12-22 17:50:13

'); })();