Python 中list赋值引用

开发过程中发现(其实是被坑了,import了一个list并赋值给当前的局部变量,由于我不需要首元素,然后就del()掉,结果影响了其它模块),python中list赋值并不是拷贝,而是指针或者引用,看了些文章,发现是引用,底层实现没有去看,应该是C的指针吧

>>> la = [1, 2]
>>> lb = la
>>> lc = []
>>> lc = la
>>> ld = la[:]
>>> la, lb, lc, ld
([1, 2], [1, 2], [1, 2], [1, 2])
>>> lb[0] = 'b'
>>> la, lb, lc, ld
(['b', 2], ['b', 2], ['b', 2], [1, 2])
>>> lc[0] = 'c'
>>> la, lb, lc, ld
(['c', 2], ['c', 2], ['c', 2], [1, 2])
>>> id(la)
4341415808
>>> id(la), id(lb), id(lc), id(ld)
(4341415808, 4341415808, 4341415808, 4341470128)
>>> le = la[1:]
>>> la, lb, lc, ld, le
(['c', 2], ['c', 2], ['c', 2], [1, 2], [2])
>>> le[0] = 'e'
>>> la, lb, lc, ld, le
(['c', 2], ['c', 2], ['c', 2], [1, 2], ['e'])
>>> id(la), id(lb), id(lc), id(ld), id(le)
(4341415808, 4341415808, 4341415808, 4341470128, 4341566064)
可以看到lb[0] lc[0]都修改了la[0]的值

id[0] 没有发生变化, le[0]的修改只影响了自己的值

通过id()可以看到la lb lc的地址是一样的,ld le是新的不同的地址

这也可以看到如果想要变量是拷贝的可以用[:]来拷贝全部或部分元素

参考:

http://www.cnblogs.com/yuyan/archive/2012/04/21/2461673.html

http://www.douban.com/note/226827597/



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值