Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python에는 증감 연산자(++, --)가 없다? 대안과 내부 동작 원리

Python에는 C나 Java 같은 언어에서 사용하는 단항 증감 연산자(++/--)가 존재하지 않습니다. 대신 값을 1만큼 증가시키려면 다음과 같이 작성합니다.

a += 1

값을 1만큼 감소시키려면 다음을 사용합니다.

a -= 1

기본 예제

>>> a = 0
>>>
>>> # 증가(Increment)
>>> a += 1
>>>
>>> # 감소(Decrement)
>>> a -= 1
>>>
>>> # a의 값 확인
>>> a
0

Python은 같은 작업을 수행하는 여러 가지 방법을 제공하지 않는다는 철학을 가지고 있습니다. 따라서 증감 연산자 대신 복합 할당 연산자(+=, -=)를 사용하는 것이 Pythonic한 방식입니다.

C 언어 경험자라면 주의할 점

C 계열 언어에 익숙하다면 한 가지 중요한 차이점을 이해해야 합니다. Python에는 C에서처럼 '변수(variable)'라는 개념이 없습니다. 대신 Python은 이름(name)객체(object)를 사용하며, 정수(int) 타입은 불변(immutable)입니다.

예제를 통해 살펴보겠습니다.

>>> a = 1
>>> print(id(a))
1919375088
>>> print(hex(id(a)))
0x726756f0

위 코드가 의미하는 바는 다음과 같습니다. 값이 1인 int 타입 객체를 생성하고, 그 객체에 이름 a를 붙입니다. 즉, 객체는 값이 1인 int의 인스턴스이며, 이름 a는 그 객체를 참조합니다. 할당된 이름 a와 그것이 참조하는 객체는 서로 구별되는 존재입니다.

a += 1 실행 시 내부 동작 과정

이제 a를 증가시켜 보겠습니다.

>>> a += 1
>>> print(id(a))
1919375104
>>> print(hex(id(a)))
0x72675700

int는 불변이므로, Python은 위 문장을 다음과 같은 단계로 처리합니다.

  • a가 참조하는 객체를 찾습니다 (id: 0x726756f0)

  • 해당 객체의 값을 조회합니다 (값: 1)

  • 값에 1을 더합니다 (1 + 1 = 2)

  • 값이 2인 새로운 int 객체를 생성합니다 (id: 0x72675700)

  • 이름 a를 새 객체에 재바인딩(rebind)합니다

  • 이제 a는 새 객체(0x72675700)를 가리키며, 기존 객체(0x726756f0)는 더 이상 a에 의해 참조되지 않습니다. 만약 다른 이름도 기존 객체를 참조하지 않는다면, 해당 객체는 나중에 가비지 컬렉션으로 메모리에서 회수됩니다.

정리하면, a += 1aa + 1재할당(reassign)하는 것입니다. 이는 진정한 의미의 증감 연산자가 아닙니다. a 자체를 '증가'시키는 것이 아니라 새로운 값을 다시 할당하기 때문입니다.

여러 이름이 하나의 객체를 참조하는 경우

추가 예제를 통해 증가/감소 동작을 더 명확하게 이해해 보겠습니다.

>>> a = b = c = 1
>>> id(a)
1919375088
>>> id(b)
1919375088
>>> id(c)
1919375088
>>> # 위 세 이름은 모두 동일한 id를 가짐
>>>
>>> # 이제 a를 증가
>>> a += 1
>>> id(a)
1919375104
>>> id(b)
1919375088
>>> id(c)
1919375088

위 결과에서 알 수 있듯이, 처음에는 a, b, c 세 이름이 모두 하나의 객체(id: 1919375088)를 참조하고 있었습니다. 하지만 a를 증가시키면 a는 새로운 객체(id: 1919375104)에 재할당되는 반면, bc는 여전히 기존 객체(id: 1919375088)를 참조합니다. 이것이 Python의 이름 바인딩 방식을 잘 보여주는 예입니다.

++/--를 입력하면 어떻게 될까?

흥미롭게도 Python에서 ++ 또는 -- 표현식 자체는 문법 오류 없이 동작하는 것처럼 보일 수 있습니다.

>>> a = 1
>>> ++a
1
>>> --a
1

그러나 이것이 증감 연산자가 아니라는 점에 유의해야 합니다. Python은 ++a+(+a)로, --a-(-a)로 해석합니다. 즉, 단항 덧셈/뺄셈 연산자가 두 번 연속으로 적용된 것일 뿐입니다. 반면 a++a--처럼 피연산자 뒤에 연산자를 붙이는 형태는 SyntaxError가 발생합니다.

결론적으로, Python에서 값을 증가·감소시킬 때는 항상 a += 1, a -= 1 형태의 복합 할당 연산자를 사용하는 것이 올바른 방법입니다.