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

时间:2014-04-17 16:19:50

标签: python list

以下代码:

#!/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 + []是创建两个单独但相同的列表实例的最佳方法吗?我想创建两个变量,指向两个具有完全相同值的不同列表/对象。我该怎么做?

此外,我如何知道哪些操作创建新列表以及哪些操作更改当前列表?我知道追加更改列表并添加两个列表并创建一个新列表。我在https://docs.python.org/3.4/library/stdtypes.html#mutable-sequence-types中找到了可能的操作列表,但哪些操作可以执行哪些操作?

2 个答案:

答案 0 :(得分:3)

获取列表的浅表副本:

b = a[:]  # There are various other options such as list(a), copy.copy(a) etc.

ab现在相同,但不要指向相同的参考。


就地修改列表的方法是list的方法,例如.sort()。您知道,如果使用=运算符完成了新值,则会分配新值。

答案 1 :(得分:2)

要复制或克隆列表有很多东西: -

  
      
  • 您可以对其进行切片:

         

    new_list = old_list [:]

         

    Alex Martelli's关于这一点的观点(至少在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)
    
  •   
     

显然是最慢和最需要记忆的方法,但有时是不可避免的。

有关详细信息,请查看此answer