python写脚本的时候用list赋值操作出现了问题,仔细查阅了些资料,说下自己的理解。
下面是ipython代码:
In [17]: a=b=c=[ ]
In [18]: id(a),id(b),id(c)
Out[18]: (4346872680, 4346872680, 4346872680)
其中id函数是获得对象的内存地址,可以看出当用连等的时候,只是生成了几个值的引用
所以如果想要生成几个相同值的list需要分开写,如:
In [20]: a=[0 for i in xrange(5)]
In [21]: b=[0 for i in xrange(5)]
In [22]: id(a),id(b)
Out[22]: (4347321952, 4347312680)
也可以用复制,当然不能直接用b=a,这是多一个引用,需要用切片,或者list函数,如:
In [25]: b=a[:]
In [26]: id(a),id(b)
Out[26]: (4347321952, 4347320584)
In [27]: b=list(a)
In [28]: id(a),id(b)
Out[28]: (4347321952, 4347345088)
这时候更改b中的元素,a是不会有变化的,但是如果a中元素含有list,那也会跟着变化,如:In [29]: a=[1,2,3,[1,2,3]]
In [30]: b=list(a)
In [31]: b[0]=4
In [32]: b[3][0]=4
In [33]: a
Out[33]: [1, 2, 3, [4, 2, 3]]
In [34]: b
Out[34]: [4, 2, 3, [4, 2, 3]]
可以看到当更改index0上的元素时,a中元素并没有改变,但是更改index3上的list的时候却让a跟着变化了In [37]: id(a[3]),id(b[3])
Out[37]: (4347320584, 4347320584)
可以看到他们的地址是一致的,在上面的例子中用id(a[2]),id(b[2])也会得到相同的地址,这并不代表他们是相同的引用,原因是python会默认将1,2,3这些比较小的整形存在缓存中,如果在这里起初把a[2]中的值设为字符串或者浮点型,那id(a[2]),id(b[2])将得到不同的值。