Python: 如何创建新的相同列表对象?

0 投票
2 回答
1847 浏览
提问于 2025-04-18 03:09

以下代码:

#!/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.

ab 现在是一样的,但它们并不是指向同一个地方。


那些会直接修改列表的方法,比如 .sort(),都是 list 的方法。如果你看到用 = 这个符号在赋值,那就说明是给一个新的值。

撰写回答