[python] list = list * 2 VS list *= 2

lv2dev·2024년 8월 18일
0

Python 이것저것

목록 보기
4/7

thank you for gpt...

list = list * 2list *= 2는 모두 리스트를 두 배로 확장하는 동작을 수행한다. 하지만 내부적으로는 두 표현식이 다르게 동작한다.

list = list * 2

  • 이 표현식은 리스트를 두 배로 확장하는 데 새로운 리스트를 생성하고, 그 리스트를 list 변수에 다시 할당하는 방식이다. 중요한 것은 이 표현식이 새로운 리스트 객체를 만들고 기존 리스트와는 다른 메모리 위치를 참조한다는 것이다.

동작 과정

  1. 리스트 복사:list * 2list의 요소를 두 배로 복사하여 새로운 리스트 객체를 생성합니다. 이 새로운 객체는 기존 리스트의 요소들을 복제한 새로운 리스트이므로, 기존 리스트와는 다른 메모리 위치에 저장된다.
  2. 변수 재할당: list = ...은 변수 list에 새로운 리스트를 할당합니다. 즉, 이전에 list가 참조하고 있던 리스트 객체는 가비지 컬렉션(garbage collection)에 의해 정리될 수 있으며, 새로운 리스트가 list 변수의 새로운 참조 대상이 된다.

list *= 2

  • 이 표현식은 원본 리스트 자체를 수정 하는 방식이다. 즉 list 변수에 할당된 리스트를 그대로 유지하면서 리스트의 내용을 두 배로 확장하는 방식으로 작동한다.
  • 이는 기존 리스트 객체를 직접 수정하는 제자리 연산(in-place operation)을 수행한다.

동작 과정

  1. 제자리 연산(In-Place operation): list *= 2는 기존 리스트 객체를 복사하여 그 리스트에 추가한다. 이 과정에서 새로운 리스트 객체를 생성하지 않고, 기존 리스트를 직접 수정하게 된다.
  2. 연산자 오버로딩: 파이썬의 *= 연산자는 __imul__() 메서드를 호출하여 제자리에서 값을 변경하는 동작을 수행한다. 리스트에서는 __imul()__ 메서드가 리스트의 요소를 확장하는 역할을 한다.

연산자 오버로딩의 차이

파이썬에서 *=*연산자는 객체의 타입에 따라 다르게 동작한다. 이 동작은 각각의 객체가 구현한 연산자 오버로딩 메서드에 의해 결정된다.

  • list * 2__mul()__ 메서드를 호출한다. 이 메서드는 새로운 객체를 생성하여 반환하는 연산이다.
  • list *= 2__imul()__ 메서드를 호출한다. 이 메서드는 가능한 경우 제자리에서 연산을 수행하며, 기존 객체를 수정한다

주의사항

리스트를 다른 변수들이 참조하고 있을 때 list *= 2는 제자리 연산이기 때문에 리스트를 참조하는 모든 변수들이 동일한 변경을 경험하게 된다.

결론

  • list = list * 2: 새로운 리스트 객체를 생성하고 이를 변수에 재할당하는 방식이다. 원본 리스트는 가비지 컬렉션 대상이 되며, 새로운 리스트가 생성되어 변수에 할당됩니다. 이 방식은 부작용이 없지만, 추가 메모리 할당이 발생한다.

  • list *= 2: 제자리 연산을 통해 리스트 객체 자체를 수정하는 방식이다. 새로운 객체가 생성되지 않고, 기존 리스트의 요소가 반복하여 추가된다. 이 방식은 메모리 효율적이지만, 부작용이 발생할 수 있다.

profile
언제나 레벨업을 하고 싶은 영원한 lv1

0개의 댓글