Python 表达式 i += x 与 i = i + x 等价吗?

Python 表达式 i += x 与 i = i + x 等价吗?

看个例子

a = [1, 2, 3]
b = a
# 写法一
b += [4]
# 写法二
# b = b + [4]
print(id(a), a)
print(id(b), b)

两种不同的写法,结果不一致

  1. 写法一结果:

    2305441971976 [1, 2, 3, 4]	
    2305441971976 [1, 2, 3, 4]
    
  2. 写法二结果

    2113739341576 [1, 2, 3]	
    2113739385672 [1, 2, 3, 4]
    

解释

+= 操作首先会尝试调用对象的 __iadd__方法,如果没有该方法,那么尝试调用__add__方法,先来看看这两个方法有什么区别

  • add 方法接收两个参数,返回它们的和,两个参数的值均不会改变。

  • iadd 方法同样接收两个参数,但它是属于 in-place 操作,就是说它会改变第一个参数的值,因为这需要对象是可变的,所以对于不可变对象没有__iadd__方法。

      >>> hasattr(int, '__iadd__')
      False
      >>> hasattr(list, '__iadd__')
      True
    

因此对于可变对象(列表,字典等)进行 += 操作时,会存在潜在的bug

posted @ 2020-12-09 14:24  rm-rf*  阅读(132)  评论(0编辑  收藏  举报