今天在重构代码时,遇到了一个问题,找了好久才发现是在变量链式赋值的时候出了问题,记下来以免以后再犯。

以下是例子:

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的内存地址则不一样。

今天由于这个问题耽误了我一些时间,提醒大家,尤其是像我一样,在重构代码的时候,往往可能会由于想减少代码行数而使用链式赋值操作。

千万要谨慎,否则可能会得到无法预料的结果。链式赋值其实对应的都是一个对象。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2013-04-03 17:37  andy071001  阅读(501)  评论(0编辑  收藏  举报