宋寅图片,长大导航,万能空调遥控器
我一直以为a+=b和a=a+b是一样的,毕竟效果是一样的嘛。后来我发现并不是这么回事?我发现当变量是不可变对象时,a+=b和a=a+b是一样的,不过我注意到了前后两个a已经不是同一个对象了。而当变量是可变对象时,虽然a+=b和a=a+b的效果是一样的,但是a=a+b前后的两个a也不是同一个对象了,而a+=b前后两个a还是同一个对象。
# 不可变对象 # a+=b 前后的a不是同一个对象 >>> a=1 >>> b=2 >>> id(a) 140722530604704 >>> a+=b >>> id(a) 140722530604768 >>> print(a) 3 # a=a+b 前后的a也不是同一个对象 >>> a=1 >>> b=2 >>> id(a) 140722530604704 >>> a=a+b >>> id(a) 140722530604768 >>> print(a) 3
# 可变对象 # a+=b 前后的a是同一个对象 >>> a=[1,2] >>> b=[3,4] >>> id(a) 214391266944 >>> a+=b >>> id(a) 214391266944 >>> print(a) [1, 2, 3, 4] # a=a+b 前后的a不是同一个对象 >>> a=[1,2] >>> b=[3,4] >>> id(a) 2143494790272 >>> a=a+b >>> id(a) 2143494790592 >>> print(a) [1, 2, 3, 4]
这是怎么回事呢?看了一下各位大佬写的文章,总算是弄明白了一些。
+
操作调用的是__add__方法__add__方法会返回一个新的对象,原对象不修改。
+=
操作调用了__iadd__方法__iadd__方法直接在原对象上进行更新,该方法的返回值为none。
没有该方法时,再尝试调用__add__方法。
当变量是不可变对象时,a+=b和a=a+b调用的都是__add__方法,返回的是一个新对象
当变量是可变对象时,a+=b调用的是__iadd__方法,直接在原对象上进行更新;a=a+b调用的是__add__方法,返回一个新对象
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Python 实现将numpy中的nan和inf,nan替换成对应的均值
python爬虫把url链接编码成gbk2312格式过程解析
网友评论