今天在重构代码时,遇到了一个问题,找了好久才发现是在变量链式赋值的时候出了问题,记下来以免以后再犯。
以下是例子:
a = b = c = []
c = [1,2,3]
执行这两条语句之后,查看abc的值:a和b仍然都是[],c已经是[1,2,3]
继续:
c.append(3)
b.append(1)
现在看abc的值,c是[1,2,3,3],b是[1],重点来了,a现在也成为了[1]
而我们对a没有进行任何地操作,这说明,a和b代表的对象是相同的。
那么出现这种情况的原因是什么呢?
这是因为python的变量定义的机制。
python链式赋值:a = b = c = [],这时候,a,b,c对应的都是同一个内存中的地址。
而对c进行赋值操作之后,则是从内存中分配另一个地方,并且让c重新指向这个新的地址,所以如果查看abc的内存地址,如下:
In [20]: hex(id(a))
Out[20]: '0x2bc13f8'
In [21]: hex(id(b))
Out[21]: '0x2bc13f8'
In [22]: hex(id(c))
Out[22]: '0x2b32098'
可以看出赋值操作之后,a和b的内存地址相同,而c的内存地址则不一样。
今天由于这个问题耽误了我一些时间,提醒大家,尤其是像我一样,在重构代码的时候,往往可能会由于想减少代码行数而使用链式赋值操作。
千万要谨慎,否则可能会得到无法预料的结果。链式赋值其实对应的都是一个对象。