Python: 如何创建新的相同列表对象?
以下代码:
#!/usr/bin/python
def func(listtt):
a.reverse()
a = [1, 2, 3]
b = a
print a, b
func(a)
print a, b
a = [1, 2, 3]
b = a + []
print a, b
func(a)
print a, b
产生的输出是:
[1, 2, 3] [1, 2, 3]
[3, 2, 1] [3, 2, 1]
[1, 2, 3] [1, 2, 3]
[3, 2, 1] [1, 2, 3]
我明白在第一个例子中,a 和 b 都指向同一个列表。我的问题是,如何创建一个新的、相同的列表对象?如果我有一个列表,b = a + [ ] 是不是创建两个独立但内容相同的列表的最佳方法?我想创建两个变量,它们指向两个不同的列表/对象,但内容完全一样。我该怎么做?
另外,我怎么知道哪些操作会创建一个新列表,哪些会改变当前的列表?我知道 append 会改变列表,而加法会把两个列表合并并创建一个新列表。我在 https://docs.python.org/3.4/library/stdtypes.html#mutable-sequence-types 找到了一份可能的操作列表,但哪些操作是做什么的呢?
2 个回答
2
复制或克隆一个列表的方法有很多种:
你可以用切片来复制:
new_list = old_list[:]
根据Alex Martelli的看法(至少在2007年时),这种写法有点奇怪,不太好理解,他觉得用下面的方法更容易看懂。
你可以使用内置的
list()
函数:new_list = list(old_list)
你也可以使用通用的
copy.copy()
方法:import copy new_list = copy.copy(old_list)
这个方法比list()稍慢,因为它需要先确定old_list的数据类型。
如果列表里有对象,而且你也想复制这些对象,可以使用通用的
copy.deepcopy()
:import copy new_list = copy.deepcopy(old_list)
显然,这种方法是最慢的,并且最占内存,但有时候是没办法避免的。
想了解更多细节,可以看看这个回答。
3
要获取一个列表的浅拷贝,可以这样做:
b = a[:] # There are various other options such as list(a), copy.copy(a) etc.
a
和 b
现在是一样的,但它们并不是指向同一个地方。
那些会直接修改列表的方法,比如 .sort()
,都是 list
的方法。如果你看到用 =
这个符号在赋值,那就说明是给一个新的值。