中国男女做网站,自己做网站平台,平面设计免费课程视频,网上怎么开平台做销售引出
今天在运行之前写的一个Python脚本时#xff0c;发生了一个奇怪的现象#xff08;我怎么老遇到奇怪的现象#xff5e;#xff5e;#xff09;。当时的代码大概长这样#xff1a;
a [1, 2, 3]
b [4, 5, 6]
# ...一大段逻辑
c a
c b
# ...一大段逻辑
# 在这里发生了一个奇怪的现象我怎么老遇到奇怪的现象。当时的代码大概长这样
a [1, 2, 3]
b [4, 5, 6]
# ...一大段逻辑
c a
c b
# ...一大段逻辑
# 在这里a变成了[1, 2, 3, 4, 5, 6]
首先上面的代码一个函数过于长了实在不像话
当时的情景是这样的程序并没有想我预期中一样运行。我找了半天没有找到对a变量的修改或赋值操作。
最终发现了藏在中间的c变量因为是列表对象的引用赋值所以直接修改了a变量。我将两个变量的地址打印出来确实是这样的。 本来查到这里基本上破案了。也应该没有后续了
但我上网查了一下有人说用 就不会出现这种情况我轻蔑的笑了有什么区别么不信邪的我试了一下。 What谁能告诉我发生了什么
探究
根据我的推测必然是操作改变的是原对象操作返回了新的对象。尝试一下 果不其然。在此破案。
解惑
都知道Python的运算符重载操作加法调用的是__add__方法调用的是__iadd__方法。既然产生这个现象那一定是list对两个方法的实现不同咯。
尝试自己动手测试写一个Test类实现两个重载方法 分别调用和 可以看到都是新的值。如果修改一下方法的实现 再测试就会发下两个运算返回的都是同一个对象。水落石出Python对两个不同的运算符使用了不同的实现方法。
一探究竟
那为什么Python会在 操作时直接修改原对象。而操作却要返回新的对象呢
简单推测一下可能Python的作者认为操作是要将后边的值加到自身上。而则是两个值的运算操作。根据表达是也可以看出
a b # 这里只涉及两个变量将b的内容直接加到a上
c a b # 这里涉及到了三个变量将后两者内容相加后赋值给新的变量 最后既然和的实现不同那么同理列表的-和-、*和*、/和/的实现也必然不同。
哦不好意思list没有实现减法和除法的操作。但乘法确实也是这样。
好吧之后再进行对象运算符重载时可以参考一下上面的做法仔细想想还是很合乎逻辑的。