2013-05-14 2 views
4
나는 이러한 기능에 일하고

에서 함수 호출에서 변경되지 않습니다 목록을 복사 (this 참조)파이썬

def removeFromList(elementsToRemove): 
    def closure(list): 
     for element in elementsToRemove: 
      if list[0] != element: 
       return 
      else: 
       list.pop(0) 
    return closure 

def func(listOfLists): 
    result = [] 
    for i, thisList in enumerate(listOfLists): 
     result.append(thisList) 
     map(removeFromList(thisList), listOfLists[i+1:]) 
    return result 

을 내가 인수, 로 전달하려는 목록을 가지고 있지만, 이 목록을 그대로 유지하고 싶습니다.

my_list = [[1], [1, 2], [1, 2, 3]] 
print my_list 
#[[1], [1, 2], [1, 2, 3]] 

copy_my_list = list (my_list) 

#This also fails 
#copy_my_list = my_list [:] 

print id (my_list) == id (copy_my_list) 
#False 

print func (copy_my_list) 
#[[1], [2], [3]] 

print my_list 
#[[1], [2], [3]] 

하지만 내 원래의 목록을 변경하지 : 내가 시도하는 것입니다. 아이디어가 있으십니까?

답변

7

사용 copy.deepcopy :

from copy import deepcopy 
new_list = deepcopy([[1], [1, 2], [1, 2, 3]]) 

데모 :

list(my_list)my_list[:]이 목록의 얕은 사본을 얻을에
>>> lis = [[1], [1, 2], [1, 2, 3]] 
>>> new_lis = lis[:]     # creates a shallow copy 
>>> [id(x)==id(y) for x,y in zip(lis,new_lis)] 
[True, True, True]      #inner lists are still the same object 

>>> new_lis1 = deepcopy(lis)   # create a deep copy 
>>> [id(x)==id(y) for x,y in zip(lis,new_lis1)] 
[False, False, False]     #inner lists are now different object 
+0

감사합니다. 왜이 일이 일어 났는지 말해 줄 수 있어요? –

+2

@ pushpen.paul 왜냐하면'[:]'와'list()'는리스트의 얕은 사본만을 생성하고 내부리스트는 여전히 같은 객체이기 때문입니다. 그리고'my_list' 또는'new_list'에서 그것들을 변경할 수 있습니다. –

3

모두.

id(copy_my_list[0]) == id(my_list[0]) 
# True 

그래서 당신의 문제를 방지하기 위해 copy.deepcopy를 사용

copy_my_list = copy.deepcopy(my_list) 
id(copy_my_list[0]) == id(my_list[0]) 
# False 
1

는 튜플을 사용합니다. my_list = ([1], [1, 2], [1, 2, 3])

my_list 지금은 불변이며, 언제 당신이 누군가가 내 관심을 끌게되면서 변경 가능한 사본 방금 list(my_list)

>>> my_list = ([1], [1, 2], [1, 2, 3]) 
>>> def mutate(aList): 
     aList.pop() 
     return aList 

>>> mutate(list(my_list)) 
[[1], [1, 2]] 
>>> my_list 
([1], [1, 2], [1, 2, 3]) 
>>> 

을 사용할 수 원하는,이 솔루션은 고장이 아닙니다. 튜플 자체는 변경 가능하지 않지만 요소는 (변경 가능한 객체 인 경우 - 어떤 목록인지)입니다.

+0

Funfact : 튜플의 목록은 어쨌든 여전히 변경 가능합니다. 목록이기 때문에 문제가 해결되지 않습니다. –

+0

오 그래? 시도 해봐. – mrKelley

+0

질문의 func (listOfLists) 함수를 사용해 보셨습니까? –