본문 바로가기
프로그래밍

python의 루프에 대해 실수합니다.

by it-view 2022. 1. 13.
반응형

파이썬의 for 루프는 C++와 다르다.

1.파이톤은 내가 원하는 것을 하지 않는다.

최근에 코드를 작성하면서 python에서 for와 c++에서 for의 차이를 발견했습니다.

파이썬 코드

for i in range(8):
    if i % 2 == 0:
            i += 2
    print(i, end=' ')
 

결과

2 1 4 3 6 5 8 7 

원래 저의 의도는 이 프로그램이 두 번의 고른 점프를 만나게 하는 것이었습니다. 확실히 파이썬은 여전히 8번 실행된다.

C++ 코드

for(int i = 1; i<=8;i++)
{
              if(i%2==0){
                               i += 2; 
              }
              cout<<i<<' ';
}
 

결과

1 4 5 8

2. 이유

python의 for loop는 본질적으로 반복자이며 별도의 스레드에서 작동하고 뮤텍스(상호 배제) 잠금을 가지고 있다.

반복기가 생성되면 반복 가능한 객체를 가리키는 메모리 내 인덱스 테이블을 생성합니다(이 경우 범위(8)). 내가 변경할 때 뮤텍스 잠금으로 인해 이 인덱스 테이블의 내용이 동시에 변경되지 않습니다. 이것은 내가 아니라고도 할 수 있습니다.

 

하지만 참고문헌이라면 문제없고 이해하기 쉽습니다. 예를 들어, 인쇄(i+2)를 루프로 인쇄해도 괜찮습니다. I가 참조한 것은 여전히 i입니다.

물론 python의 for 루프는 루프의 수를 바꿀 수도 있다. 포커스는 이 문장에 있습니다. for 반복자에 의해 만들어진 메모리 인덱스 테이블은 반복 가능한 객체를 가리킵니다.

예를 들어, 목록을 살펴보겠습니다.

a= [1,2,3,4]

이 목록은 본질적으로 a [0], a [1], a [2], a [4]에 대한 참조이며, 목록 자체가 반복 가능한 객체이기 때문에 우리는 이 목록 (가능 개체)의 내부 참조를 변경합니다.

 
count = 0
for i in a:
    a[1:] = [1]
    count += 1
print(count)

카운트 결과는 2입니다.

위의 내용으로는 내부적으로 운영할 방법이 없습니다. 첫 번째 i는 메모리 인덱스 테이블을 하나씩 검색하는 것이고 두 번째 i는 새로운 객체입니다.
목록의 경우 메모리 인덱스 테이블 자체가 변경되었음을 의미하는 반복 가능한 객체의 구조를 직접 변경합니다.

3. 사용하면서

i = 1
while i < 8:
    if i % 2 == 0:
            i += 2
    print(i, end=' ')
    i+=1;
 

결과

1 4 5 8

저를 팔로우하고 제 기사에 박수를 보내며 여러분의 견해를 밝힌 것을 환영합니다. 기분이 좋으면 페이스북과 트위터에 공유해주세요.

댓글