Programming Languages/Python

[Python] 리스트 복사하기 (변수의 개념 정확하게 이해하기)

마크투비 2022. 2. 26. 16:16

리스트를 변수에 넣고 복사할 때


파이썬에서 ‘3’은 상수가 아닌 정수형 객체이다.

파이썬의 모든 자료형은 객체이다.

a=3

여기서 3은 쉽게 생각할 수 있는 상수값이 아니고, 하나의 ‘정수형 객체’이다. 따라서 a=3과 같이 선언하면 a.real처럼 내장 함수를 바로 사용할 수 있게 된다. 이 점이 처음엔 좀 헷갈리는데 아래 코드를 보면 더 명확하게 이해할 수 있다.

a = 3
print(type(3))
# <class 'int'>

변수 개념 정확하게 이해하기

위 설명이 이해가 갔다면 파이썬에서 변수의 개념을 제대로 이해할 수 있을 것이다. 파이썬에서 변수는 객체를 가리키는 것이라고 말할 수 있다. 다시 한 번 강조하지만 파이썬의 모든 자료형은 객체이다.

a=3

위의 코드처럼 a=3이라고 하면 정수형 객체 3이 자동으로 메모리에 생성된다. a는 변수의 이름이고, 정수형 객체가 저장된 메모리의 위치를 가리킨다. 변수 a는 객체가 저장된 메모리의 위치를 가리키는 레퍼런스라고도 한다. 아래 그림처럼 생각하면 쉽다. 즉 변수 a가 3이라는 정수형 객체를 가리키고 있다.

리스트를 변수에 넣고 복사하고자 할 때 (같은 리스트를 가리키는 경우)

이제 파이썬에서 변수의 개념, 객체의 개념도 모두 이해했으니 리스트 자료형에서 가장 혼동하기 쉬운 ‘복사’에 대해 알아보자.

a = [1, 2, 3]
b = a
a[1] = 4
print(a) # [1, 4, 3]
print(b) # [1, 4, 3]

위와 같이 변수 b에 a가 가리키는 리스트를 대입했다. 그런 다음 a가 가리키는 리스트를 바꾸면 b 리스트도 똑같이 바뀐다. a, b 모두 같은 리스트인 [1, 2, 3]을 가리키고 있었기 때문이다. a, b는 이름만 다를 뿐이지 완전히 동일한 리스트를 가리키고 있는 변수이다. 아래 그림처럼 생각하면 이해하기 쉬울 것이다.

보통 a를 복사한다고 하면, 위와 같이 동기화되면서 복사하는 방법 말고 a와 같은 값을 가지면서 a가 가리키는 리스트와는 다른 리스트를 가리키게 하는 방법을 더 많이 사용할 것이다. 다음 2가지 방법을 통해 가능하다.

1. [:] 이용해서 복사하기

첫 번째 방법은 아래와 같이 리스트 전체를 가리키는 [:]를 이용해서 복사하는 것이다.

a = [1, 2, 3]
b = a[:]
a[1] = 4
print(a) # [1, 4, 3]
print(b) # [1, 2, 3]

2. copy 모듈 이용하기

두 번째 방법은 copy 모듈을 이용하는 방법이다.

from copy import copy
a = [1, 2, 3]
b = copy(a)
print(b is a) # False

b = copy(a)는 b = a[:]와 동일하고, 위에서처럼 b is a를 통해 두 변수가 다른 객체임을 확인할 수 있다.