python list(列表)赋值与复制

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])将得到不同的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值