본문 바로가기
SK 행복성장캠퍼스/Python 기초

0901_2일차_Python08_리스트_얕은복사_깊은복사

by NickNuma 2020. 9. 5.

리스트 파트, 마지막
얕은 복사깊은 복사입니다.



얕은 복사기본 default로 작동하는 복사 방법입니다. 주소값을 복사해서 변수에 저장합니다.
깊은 복사는 주소값이 아닌 실제값을 복사해서 변수에 저장합니다.

"""
    집합형 자료형
    1) 문자열
    2) 리스트
        a. 리스트 생성 방법
        b. 리스트 제공 함수
        c. 인덱싱 및 슬라이싱
        d. 리스트 특징

        e. 얕은 복사와 깊은 복사 (call by value, call by reference)
            ==> 파이썬에서는 모든 변수는 참조 변수이다.

            가. 얕은 복사    ( 기본 default 작동 )
                ==> 주소값 복사
                ==> 특징 : 동일한 데이터를 여러 변수가 참조하는 형태이기 때문에
                          임이의 변수가 데이터를 변경하면 다른 변수도 영향을 받는다.

            나. 깊은 복사    ( 변수명.copy() )
                ==> 실제값 복사
                ==> 특징 : 여러 변수가 데이터를 각각 참조하기 때문에
                          임이의 변수가 데이터를 변경해도 다른 변수에 영향을 주지 않는다.
                ==> 방법 : 변수명.copy()
                          변수명[:] (슬라이싱 = 동일한 새로운 리스트 생성)
                          list(변수명) (형변환? list()함수? = 동일한 새로운 리스트 생성)

"""

 


얕은 복사 = 주소값 복사입니다.
y = x를 하면 기본 default로 얕은 복사를 하고, x의 주소값을 y에 저장합니다.
이후, x의 value를 바꾸면 x의 주소값을 받은 y의 값 역시 변경됩니다.

#1. 얕은 복사 => 주소값 복사
x = [10, 20, 20, 30]
y = x
print("x={}, y={}".format(x, y))        # x=[10, 20, 20, 30], y=[10, 20, 20, 30]
print("x의 주소값 = {}, y의 주소값 = {}\n".format(id(x), id(y)))    # x의 주소값 = 2876547788160, y의 주소값 = 2876547788160
x[0] = 100      # 기본 default = 얕은 복사
print("x[0]을 100으로 변경 (y값 변경 명령 없음)")
print("x={}, y={}".format(x, y))        # x=[100, 20, 20, 30], y=[100, 20, 20, 30]
print("x의 주소값 = {}, y의 주소값 = {}".format(id(x), id(y)))      # x의 주소값 = 2876547788160, y의 주소값 = 2876547788160

 


깊은 복사 = 실제값 복사입니다.
실제값을 복사하기 위해서는 변수.copy() 함수를 사용합니다.
y = x.copy()를 하여 깊은 복사를 하게되면 x에서 값을 변경하여도 y의 값에는 영향을 끼치지 않습니다.

#2. 깊은 복사 => 실제값 복사
# print(dir(list))
x = [10, 20, 20, 30]
y = x.copy()    # 1) 깊은복사 => 변수명.copy()
# y = x[:]        # 2) 깊은복사 => 슬라이싱 x[:]
# y = list(x)     # 3) 깊은복사 => 형변환 list(x)
print("x={}, y={}".format(x, y))    # x=[10, 20, 20, 30], y=[10, 20, 20, 30]
print("x의 주소값 = {}, y의 주소값 = {}\n".format(id(x), id(y)))    # x의 주소값 = 2876548077504, y의 주소값 = 2876548077568
x[0] = 100
print("x[0]을 100으로 변경 (y값 변경 명령 없음)")
print("x={}, y={}".format(x, y))    # x=[100, 20, 20, 30], y=[10, 20, 20, 30]
print("x의 주소값 = {}, y의 주소값 = {}".format(id(x), id(y)))      # x의 주소값 = 2876548077504, y의 주소값 = 2876548077568


이렇게~ 리스트에 대한 설명을 마무리하고~
다음엔 튜플에 대한 설명을 이어가도록 하겠습니다.

그럼 이만~~~

반응형

댓글