2013-09-05 1 views
2

저는 Python을 처음 접했을뿐만 아니라 현재 상황을 파악할 수 없습니다. 파이썬은 for을 사용하여 목록을 반복 할 때 다른 모든 숫자를 건너 뜁니다. 그러나 특정 수의 요소가있는 경우에만 처리됩니다.이 코드는 제가 수행중인 더 큰 프로젝트의 일부이지만이 코드 스 니펫은이를 보여줍니다.반복되는 목록을 변경할 때 예기치 않은 동작이 발생했습니다.

코드는 7이 될 때까지 제대로 작동하며, 다른 모든 숫자는 건너 뜁니다. 나는 반복하는 과정에있는 목록을 편집하지 않기 때문에 피하는 것이지만 for은 일부를 호출하지도 않습니다. 다른 번호가 아닌 각 번호를 반복하려면 어떻게해야합니까? 왜이 일을하는거야?

코드 :

import math 

i1 = 60 
l1 = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 49, 53, 59] 
l3 = l1 

print(l1) 
for a in l1: 
    print(a) 
    if a > math.floor(math.sqrt(i1)): 
     print("REMOVED: " + str(a)) 
     l3.remove(a) 

print(l3) 

출력 : 당신이 그 (것)들을 고유하려는 경우

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 49, 53, 59] 
2 
3 
5 
7 
11 
REMOVED: 11 
17 
REMOVED: 17 
23 
REMOVED: 23 
31 
REMOVED: 31 
41 
REMOVED: 41 
47 
REMOVED: 47 
53 
REMOVED: 53 
[2, 3, 5, 7, 13, 19, 29, 37, 43, 49, 59] 
+0

명확한 답을 얻기 위해 필요한 세부 사항 (예!)은 – msw

답변

6
l3 = l1 

지금 사용 , l3l1동일한 목록을 참조하십시오. 하나에 remove()을 호출하면 다른 하나에도 영향을줍니다. 따라서 l1을 반복하면서 l3.remove(a)을 호출하면 l1 (!)의 항목이 제거되고 모든 후속 요소가 아래로 이동하고 루프가 다음 요소로 반복되며 항목이 결과적으로 건너 뜁니다.

예를 들어, 우리는 다음과 같은 목록을 통해 반복하고 우리가 b을 제거하는 것이 상상 : 우리가 c을 생략

 
----------------- 
| a | b | c | d | 
----------------- 
    ^(we're on b) 

----------------- 
| a | | c | d | 
----------------- 
    ^(remove b) 

------------- 
| a | c | d | 
------------- 
    ^(shift elements down) 

------------- 
| a | c | d | 
------------- 
     ^(step) 

공지 사항.

아마도 당신은 그것을 반복하는 동안 콜렉션에서 요소를 제거하지 마십시오

l3 = list(l1) # create a new, independent list 
+0

아, 그래,이게 내가 할 줄 알았던거야. 고맙습니다! – vaindil

+0

@StevenH 기꺼이 도와 드릴 수 있습니다. [답변 수락] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235)을 잊지 마세요. 그런데 건너 뛰기 현상을 더 잘 이해할 수 있도록 시각을 추가했습니다. – arshajii

+0

@arshsajii 예, 그것을 받아 들일 것입니다, 그냥 stackoverflow 전에 나를 기다려야합니다 .... 감사합니다, 정말 고마워! – vaindil

6

l3l1이 같은 목록에 가리키고, l3 = l1[:]

+0

입니다. 실제로 가장 좋은 방법은'copy.deepcopy'입니다. 그러나 이것은 int의 목록이므로 간단한 단순 복사본 만 수행합니다. – inspectorG4dget

+0

오브젝트의 목록 일지라도,이 경우에는 'deepcopy'가 과도 할 것입니다. (나는 불확실했기 때문에 그것을 테스트했다;리스트를 참조리스트로 생각한다면'for '의 반복성을 변경하는 것이 좋지 않지만 얕은 복사본을 변경하면 문제가 발생하지 않는다는 것이 더 분명하다). – msw

1

을 의미했다. l1l3은 같은 목록을 참조합니다. 아마도 당신이 의도 한 바는 다음과 같습니다 :

l3= list(l1) 

복사본이 필요합니다.

관련 문제