Python 进阶 —— x = x+1 vs x += 1

0. 可变对象,不可变对象

  • list 是可变对象:

  • tuple,int 等是不可变对象

  • += 会首先调用对象的 .__iadd__方法,对对象本身进行修改,无返回值;如果对象为不可变对象,则会继续调用其 .__add__方法,返回操作后的结果;

    • __iadd__ in dir(tuple) ⇒ False
    • __iadd__ in dir(list) ⇒ True
    • __iadd__ in dir(int) ⇒ False
  • 对于不可变对象 a(如 tuple 或 int),a += b 与 a = a + b 等价;

    >> x = (1, 2)
    >> id(x)
    4460706120
    >> x += (3, )
    (1, 2, 3)
    >> x
    >> id(x)
    4438616104
    

1. 举例

  • x += 1:in-place(就地)修改 x 自身的值,前提 x 必须是可变对象;

  • x = x + 1

    会隐式地创建一个新的对象,表示 x 与 1的和,同时用同样的 name 指向它,所以它的含义和y = x+1相同,只不过这里将y取名为x罢了;

当我们用多个变量名指向同一对象实体时,可能对比会更加明显:

>> y = x = []
>> x += [5]
>> x
[5]
>> y 
[5]

>> x = x + [5]
>> x
[5, 5]
>> y
[5]

以下是关于 ++=运算符重载(magic method)的说明

  • +:调用 __add__,不修改它的两个操作数
  • +=:调用__iadd__,会修改它自身的值

注:表达式本身是没有返回值的,如x = 1,甚至不会返回 None,y = x = 1含义不是y = (x = 1),而是 yx 指向相同的1所在的内存对象。

如此我们也可理解 Python 下简洁的 swap:

x, y = y, x

是将 x 指向 原始的 y,y 指向 原始的 x,也即可简单理解为同时发生,而不是:

x = y
y = x
			# 走的就是C/C++ swap 的老路了
			# 需要借助中间变量

references

[1] <a href=“http://stackoverflow.com/questions/12905338/python-difference-between-x-x1-and-x-1/12905374”, target="_blank">Python Difference between x = x+1 and x += 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值