본문 바로가기
코딩 연습/코딩배우기

[python] 변경 가능한 객체(mutable), 변경 불가능한 객체(immutable) - #2

by good4me 2020. 8. 15.

goodthings4me.tistory.com

 

# 리스트에 대해 sort() 함수 실행 시 원본 변경 여부

def list_sort(r):
    r.sort() # 원본 리스트를 참조변수 r에 대입한 것과 동일
    print('r :', r)
    print(id(lst1), id(r), id(lst1)==id(r), sep=' : ') # 주소값 동일
    
lst1 = [4, 2, 6, 12, 9]
list_sort(lst1)
print('lst1 : ', lst1) # 원본 리스트값 변경됨


print('\n# 원본 리스트값 변경 안되게 하려면,')

def list_sort2(r):
    r = list(r) # 참조변수 r에 새 리스트 생성 후 다시 할당, r.copy() 또는 r = r[:] 도 가능
    r.sort()
    print('r :', r) # 새로운 리스트 sort() 결과
    print(id(lst2), id(r), id(lst2)==id(r), sep=' : ') # False

lst2 = [5, 3, 7, 13, 10]
list_sort2(lst2)
print('lst2 : ', lst2) # 원본 리스트값 변경 안됨


print('\n# 리스트의 값 수정 후 동일 여부,')
def list_modify(r):
    r[-1] += 1 # 참조변수 r에 원본 리스트 대입 후, 마지막 값 1 증가
    print('r : ', r)
    print('lst3 : ', lst3) # 원본 리스트도 변경됨 [6, 4, 8, 14, 12]
    print(id(lst3), id(r), id(lst3)==id(r), sep=' : ') # True

    r = list(r) # 참조변수 r에 새 리스트 생성 후 다시 할당 [6, 4, 8, 14, 12]
    r[-1] += 1
    print('r : ', r) # 새 리스트 변경됨[6, 4, 8, 14, 13]
    print('lst3 : ', lst3) # 원본 리스트값 변경 안됨 [6, 4, 8, 14, 12]
    print(id(lst3), id(r), id(lst3)==id(r), sep=' : ') # False

lst3 = [6, 4, 8, 14, 11]
list_modify(lst3)


# cf)
print('\n\n==== 튜플에 대해 최소/최소값 추출은? =====')
# 튜플은 sort() 함수 사용 못함. 리스트로 변경 후 최소/최대값 추출

def tuple_min_max2(r):
    r = list(r) 
    r.sort()
    print('r :', r)
 
tup2 = (4, 2, 6, 12, 9)
tuple_min_max2(tup2)
print('tup2 : ', tup2)

good4me.co.kr

[실행 결과]

r : [2, 4, 6, 9, 12]
1519651951104 : 1519651951104 : True
lst1 :  [2, 4, 6, 9, 12]

# 원본 리스트값 변경 안되게 하려면,
r : [3, 5, 7, 10, 13]
1519651986944 : 1519651637632 : False
lst2 :  [5, 3, 7, 13, 10]

# 리스트의 값 수정 후 동일 여부,
r :  [6, 4, 8, 14, 12]
lst3 :  [6, 4, 8, 14, 12]
1519651637632 : 1519651637632 : True
r :  [6, 4, 8, 14, 13]
lst3 :  [6, 4, 8, 14, 12]
1519651637632 : 1519651923200 : False


==== 튜플에 대해 최소/최소값 추출은? =====
r : [2, 4, 6, 9, 12]
tup2 :  (4, 2, 6, 12, 9)

 

[참고자료] 윤성우의 열혈 파이썬 중급편

 

 

댓글