2013-01-19 3 views
0

목록을 한 번에 2 번 (10 번) 나누고 각 파티션에서 작업을 수행하려고합니다. 한 번에 1 : 9의 비율로 목록에서이 작업을 수행하려고합니다. 목록을 10 배로 나누었고 첫 번째 반복에서 첫 번째 접기와 나머지 9에서 작업을 수행하고 두 번째 반복에서는 두 번째 접기와 나머지 9에서 작업을 수행합니다. 이제는 원래 목록의 복사본을 유지하고 접미사 중 하나를 임시 변수에 할당하고 목록에서 삭제 한 다음 나머지를 두 번째 파티션으로 가져 오기로 결정했습니다. 그런 다음 목록의 사본을 다음 반복을 위해 목록에 다시 할당하십시오. 그러나 복사본과 원본은 항상 for 루프에서 동일하므로 범위를 벗어난 인덱스의 인덱스를 얻는 것으로 보입니다. 여기서 문제의 간단한 예이다Python - for 루프에서 목록 요소를 삭제하고 목록을 다시 할당

>>> a = ['a', 'b', 'c', 'd', 'e', 'f'] 
>>> b = a 
>>> b 
['a', 'b', 'c', 'd', 'e', 'f'] 
>>> for i in xrange (len(a)): 
    del (b [i]) 
    b = a 

Traceback (most recent call last): 
    File "<pyshell#22>", line 2, in <module> 
    del (b [i]) 
IndexError: list assignment index out of range 

메모리에 모두 동일한 위치 A 및 B 지점이 상기리스트의 실제 콘텐츠를 저장하는 하나의 위치 만이 있음을 보인다. 여기에있는 문제가 무엇이고 어떻게 해결할 수 있습니까? 미리 감사드립니다!

답변

2

에 복사 라인

b = a 

을 변경하여 대신 b = ab = copy.deepcopy(a)를 사용하여 목록을 목록의 복사본을 만들 수 있습니다. 목록의 각 요소를 반복적으로 복사합니다. 그러나 이것은 또한 아래의 세 가지 대안보다 더 느릴 것이라는 것을 의미합니다.

대안 :

b = a[:] 
b = list(a) 
b = copy.copy(a) 

대안의 모든 원본리스트의 요소 개체를하는 경우, 그들은 참조하는 의미 얕은 사본을한다. copydeepcopy은 목록뿐만 아니라 모든 개체에 대해 일반화 할 수 있습니다.

=의 문제점은 동일한 개체에 대한 새 참조를 만드는 것입니다. 여기 pythontutor에서 코드의 시각화가 있습니다 - http://goo.gl/3UN3T.

+1

** + 1 ** 똑같은 이유로 똑딱 의자 – Eric

+0

를 보여주었습니다. 정말 유용합니다. 감사합니다! – poke

+0

@sidi : 고마워요, 정답과 열혈 사용자를 모두 표시합니다! – user823743

2

당신은

b = a[:] 
+0

+1 감사합니다. – user823743

관련 문제