今天爱分享给大家带来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之前的序列。