파이썬의 인플레이스(Inplace) 연산자란?
인플레이스(in-place) 연산이란 복사본을 새로 만들지 않고 기존 변수의 값을 직접 변경하는 연산을 의미합니다. 이러한 연산을 수행하는 데 사용되는 연산자를 인플레이스 연산자라고 부릅니다.
간단한 예시를 통해 살펴보겠습니다.
a = 9 a += 2 print(a)
출력 결과
11
위 예제에서 +=가 바로 인플레이스 연산자입니다. 변수 a에 2를 더한 결과가 다시 a에 저장되면서 기존 값이 직접 갱신됩니다.
이 원리는 다른 연산자에도 동일하게 적용됩니다. 대표적인 인플레이스 연산자는 다음과 같습니다.
- +=
- -=
- *=
- /=
- %=
인플레이스 연산은 숫자뿐만 아니라 다른 자료형에도 적용할 수 있습니다.
language = "Python" language += "3" print(language)
출력 결과
Python3
즉, x += y는 x = operator.iadd(x, y)와 동일한 동작을 수행합니다. 참고로 불변(immutable) 타입인 숫자나 문자열의 경우 새 객체가 생성되지만, 리스트 같은 가변(mutable) 타입은 실제로 제자리에서 수정된다는 점이 특징입니다.
operator 모듈의 주요 인플레이스 함수
파이썬의 operator 모듈은 인플레이스 연산을 수행하는 다양한 함수를 제공합니다. 각 함수의 사용법을 하나씩 살펴보겠습니다.
iadd()
현재 값에 더하기를 수행하는 함수로, x += y 연산과 동일합니다.
import operator
x = operator.iadd(9, 18)
print("덧셈 결과 : ", end="")
print(x)결과
덧셈 결과 : 27
isub()
현재 값에서 빼기를 수행하는 함수로, x -= y 연산과 동일합니다.
x = operator.isub(9, 18)
print("뺄셈 결과 : ", end="")
print(x)결과
뺄셈 결과 : -9
imul()
현재 값에 곱하기를 수행하는 함수로, x *= y 연산과 동일합니다.
x = operator.imul(9, 18)
print("곱셈 결과 : ", end="")
print(x)결과
곱셈 결과 : 162
itruediv()
현재 값을 나누기하는 함수로, x /= y 연산과 동일합니다.
x = operator.itruediv(9, 18)
print("나눗셈 결과 : ", end="")
print(x)결과
나눗셈 결과 : 0.5
imod()
현재 값에 나머지 연산을 적용하는 함수로, x %= y 연산과 동일합니다.
x = operator.imod(9, 18)
print("나머지 연산 결과 : ", end="")
print(x)결과
나머지 연산 결과 : 9
iconcat()
두 문자열(또는 시퀀스)을 연결하는 함수입니다.
x = "Tutorials"
y = "Point"
str1 = operator.iconcat(x, y)
print("연결 결과 : ", end="")
print(str1)결과
연결 결과 : TutorialsPoint
ipow()
x **= y, 즉 거듭제곱 연산과 동일한 함수입니다.
x = operator.ipow(2, 6)
print("거듭제곱 결과 : ", end="")
print(x)결과
거듭제곱 결과 : 64
표준 연산자(Standard Operators)란?
연산자(operator)는 피연산자(operand)의 값을 조작할 수 있는 구문 요소입니다.
예를 들어 9 + 18 = 27이라는 식에서 9와 18은 피연산자이고, +가 연산자입니다.
연산자의 종류
파이썬은 다음과 같은 종류의 연산자를 지원합니다.
산술 연산자: +, -, *, /, %, **, //
비교 연산자: ==, !=, >, <, >=, <=
대입 연산자: =, +=, -=, *=, /=, %=, **=, //=
논리 연산자: and(논리곱), or(논리합), not(논리부정)
비트 연산자: |, &, ^, ~, <<, >>
멤버십 연산자: in, not in
식별 연산자: is, is not
연산자와 함수의 매핑
아래 표는 파이썬 문법의 연산자 기호가 operator 모듈의 어떤 함수와 대응되는지 보여줍니다. 함수형 프로그래밍이나 map(), filter(), sorted()의 key 인자 등에서 유용하게 활용할 수 있습니다.
| 연산 | 문법 | 함수 |
|---|---|---|
| 덧셈 | x + y | add(x, y) |
| 연결(Concatenation) | seq1 + seq2 | concat(seq1, seq2) |
| 포함 여부 검사 | obj in seq | contains(seq, obj) |
| 나눗셈(실수 나눗셈) | x / y | truediv(x, y) |
| 나눗셈(정수 나눗셈) | x // y | floordiv(x, y) |
| 비트 AND | x & y | and_(x, y) |
| 비트 XOR | x ^ y | xor(x, y) |
| 비트 반전(NOT) | ~x | invert(x) |
| 비트 OR | x | y | or_(x, y) |
| 거듭제곱 | x ** y | pow(x, y) |
| 동일성 검사 | x is y | is_(x, y) |
| 동일성 검사(부정) | x is not y | is_not(x, y) |
| 인덱스 할당 | obj[k] = v | setitem(obj, k, v) |
| 인덱스 삭제 | del obj[k] | delitem(obj, k) |
| 인덱싱 | obj[k] | getitem(obj, k) |
| 왼쪽 시프트 | a << b | lshift(a, b) |
| 나머지(Modulo) | a % b | mod(a, b) |
| 곱셈 | x * y | mul(x, y) |
| 행렬 곱셈 | x @ y | matmul(x, y) |
| 산술 음수화 | -a | neg(a) |
| 논리 부정 | not a | not_(a) |
| 단항 플러스 | +a | pos(a) |
| 오른쪽 시프트 | a >> b | rshift(a, b) |
| 슬라이스 할당 | seq[i:j] = values | setitem(seq, slice(i, j), values) |
| 슬라이스 삭제 | del seq[i:j] | delitem(seq, slice(i, j)) |
| 슬라이싱 | seq[i:j] | getitem(seq, slice(i, j)) |
| 문자열 포매팅 | s % obj | mod(s, obj) |
| 뺄셈 | a - b | sub(a, b) |
| 진위 검사 | obj | truth(obj) |
| 크기 비교 | a < b | lt(a, b) |
| 크기 비교 | a <= b | le(a, b) |
| 동등성 비교 | a == b | eq(a, b) |
| 비동등 비교 | a != b | ne(a, b) |
| 크기 비교 | a >= b | ge(a, b) |
| 크기 비교 | a > b | gt(a, b) |