2014-04-17 48 views
0

以下代碼: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中找到了可能的操作列表,但哪些操作可以執行哪些操作?

回答

3

獲取列表的淺表副本:

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

ab現在是相同的,但不指向同一個參考。


是修改列表就地將是list方法,如.sort()的人。您知道如果已使用=運算符完成一個新值的分配。

+1

或者你可以這樣做:'new_list = copy(old_list)'。這可能在語義上比切片技巧更乾淨,但兩者都可以工作。這個問題已經被問了很多次了,我很肯定你可以通過簡單的搜索找到答案。 –

2

有很多事情要複製或克隆的清單: -

  • 你可以切片它:

    new_list = old_list [:]

    Alex Martelli's意見(至少回到2007年)關於這一點,這是一個奇怪的語法,並沒有任何意義使用它。 ;)(在他看來,下一個更具可讀性)。

    • 您可以使用內置的list()功能:

      new_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

相關問題