开发过程中发现(其实是被坑了,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/