# 将旧的列表复制到新的列表中

我们应该使用

new = old[:]

而不应该使用

new = old

这将会使oldnew同时指向列表对象

# 原理

首先我们需要了解Python是如何管理对象和变量。Python没有C语言中的变量。在C语言中,变量不止是个名字,它是字节集合并真实存在于内存某个位置上。而在Python中,变量仅仅是指向对象的标签。

alist = [1, 3, 5]
blist = alist

alist 是指向 列表[1, 3, 5] 的标志,同样 b 也是 列表[1, 3, 5] 的标志,如果修改了 alist ,那么 blist 也会发生变化。

使用内建函数 id() 查看唯一地址:

alist = [1, 3, 5]
blist = alist
 
print(id(alist))
>>>19005032
print(id(blist))
>>>19005032

为了获得一个新的列表,我们应该创建新的列表,这即是:

alist = [1, 3, 5]
blist = alist[:]
 
print(id(alist))
>>>16580200
print(id(blist))
>>>46600072

# 解锁更多姿势

当然,复制列表还有别的方法:
# list() 方法

alist = [1, 3, 5]
blist = list(alist)
 
print(id(alist))
>>>51117672
print(id(blist))
>>>52802824

# copy() 方法(Python3)

alist = [1, 3, 5]
blist = alist.copy()
 
print(id(alist))
>>>44695144
print(id(blist))
>>>46337960

显然,我们可以看到 list() 方法和 copy() 方法具有更强的可读性,切片虽然Pythonic,但牺牲了代码的可读性,也将没有接触过Python的人拒之门外。

参考:iFantasticMe的博客