파이썬에서 리스트 자료형은 mutable한 자료형으로써, 값의 변경이 가능하다. 리스트는 메모리에 저장될 때 값이 저장되지 않고, 값을 가리키는 주소가 저장되므로써 메모리의 효율을 높인다.
아래 예시는 미리 만든 alist를 blist라는 변수에 대입하는데, 이때 대입하는 것은 값이 아닌 alist의 주소값이다. 즉 새로 만든 변수에 alist의 주소값을 대입함으로써 blist는 alist와 동일한 것을 가리키게 된다.
blist의 값을 변경하면 당연히 alist의 값이 함께 변하며, alist의 값을 변경하면 blist의 값이 변하게 된다. 두 변수가 같은 데이터를 가리키고 있기에 발생하는 현상이다.
# 리스트 복사
alist = ['Kim', 'Park', 'Lee', 'Hong']
blist = alist # 이때, 새로운 리스트가 만들어지지 않음.
blist[0] = 'Jang'
print(blist)
print(alist)
# 주소 알기
print(id(alist))
print(id(blist))
#2896091894152
#2896091894152
C나 C++에서, 변수가 위치한 주소를 알아내는 연산자가 & 였다. 파이썬에서도 주소 개념이 있는데, 바로 id()함수이다. alist와 blist의 아이디를 조회해보면, 두 객체의 아이디가 같다는 것을 확인할 수 있다.
blist = list(alist)
print("alist 주소: ",id(alist))
print("blist 주소: ",id(blist))
# OUTPUT
alist 주소: 2739586158984
blist 주소: 2739590198664
주소가 다른 것을 볼 수 있다. 즉 두 리스트는 서로 다른 리스트이다.
lst_1 = ['a', 'b', 'c']
lst_2 =
lst_1(:)
print(lst_2)
print(id(lst_1)) # 2035684954440
print(id(lst_2)) # 2035684957640
객체는 데이터가 메모리에 그대로 저장되는 것이 아니라 참조 형식으로 저장되기 때문에, 값을 변경하거나, 함수의 인수로 넘겨줄 때 주의해서 사용해야 한다.