inplace parameter는 새로운 객체를 만들지(inplace=False) 기존 객체를 바로 변경할지(inplace=True)를 결정한다.
파이썬에서 객체는 mutable/immutable로 나눌 수 있다.
mutable
my_list = [1, 2, 3]
print(id(my_list)) # 원래 리스트의 id
my_list.append(4) # 리스트에 새로운 요소 추가
print(my_list) # [1, 2, 3, 4]
print(id(my_list)) # 같은 id를 가짐
# a + = b
original_list = [1, 2, 3]
new_list = original_list
print("Before")
print(f'original: {original_list}')
print(f'new_list: {new_list}')
print(f'id(original_list) is id(new_list) -> {id(original_list) == id(new_list)}')
original_list += [4]
print("After")
print(f'original: {original_list}')
print(f'new_list: {new_list}')
print(f'id(original_list) is id(new_list) -> {id(original_list) == id(new_list)}')
# Before
# original: [1, 2, 3]
# new_list: [1, 2, 3]
# id(original_list) is id(new_list) -> True
# After
# original: [1, 2, 3, 4]
# new_list: [1, 2, 3, 4]
# id(original_list) is id(new_list) -> True
immutable
my_str = "hello"
print(id(my_str)) # 원래 문자열의 id
my_str = my_str + " world" # 새로운 문자열 생성
print(my_str) # "hello world"
print(id(my_str)) # 새로운 id를 가짐
# a = a + b
original_list = [1, 2, 3]
new_list = original_list
print("Before")
print(f'original: {original_list}')
print(f'new_list: {new_list}')
print(f'id(original_list) is id(new_list) -> {id(original_list) == id(new_list)}')
original_list = original_list + [4]
print("After")
print(f'original: {original_list}')
print(f'new_list: {new_list}')
print(f'id(original_list) is id(new_list) -> {id(original_list) == id(new_list)}')
# Before
# original: [1, 2, 3]
# new_list: [1, 2, 3]
# id(original_list) is id(new_list) -> True
# After
# original: [1, 2, 3, 4]
# new_list: [1, 2, 3]
# id(original_list) is id(new_list) -> False
파이썬에서, += 연산자는 iadd 메서드를 호출하는 반면, + 연산자는 add 메서드를 호출한다. __iadd__는 "in-place add"로, 가능하면 객체 자체를 수정하려고 한다.
[참고] in-place-operator