Python

Python 문법 기초 4 - 집합 자료형(list), 얕은 복사, 깊은 복사

코딩탕탕 2022. 10. 22. 15:02

 

# 묶음형(집합형) 자료형 : list - 순서 O, 수정 O

a = [1, 2, 3]; b = [10, a, 12.5, True, '문자열'] //연속으로 쓸 경우에는 ;를 사용한다.
print(a, type(a), id(a))
print(b, type(b), id(b))
aa = []
bb = list() # 함수 호출로도 list 타입 가능하다.
print(type(aa), type(bb))


<console>
[1, 2, 3] <class 'list'> 3105589296960
[10, [1, 2, 3], 12.5, True, '문자열'] <class 'list'> 3105589284416
<class 'list'> <class 'list'>

배열 안에 배열이 들어갈 수 있다. 변수에 [] 를 주면 list 타입이 된다.

위에 처럼 메소드로 호출해도 list 타입이 된다.

 

family = ['엄마', '아빠', '나', '여동생']
print(family[2])
print(family[0:2])
family.append('남동생')
family.insert(0, '할아버지')
family.extend(['삼촌', '조카'])
family += ['이모', '고모']
family.remove('남동생')
del family[2]
print(family, len(family))
print(family.index('나'))
print('엄마' in family, '할머니' in family)

del family # 변수를 삭제
# print(family) // 삭제되었기 때문에 호출 불가 err


<console>
나
['엄마', '아빠']
['할아버지', '엄마', '나', '여동생', '삼촌', '조카', '이모', '고모'] 8
2
True False

append 로 배열 추가 가능하다.(맨 뒤에) insert 함수로 원하는 인덱스에 추가 가능하다.

extend 를 사용하면 복수를 추가할 수 있다. family += ['이모', '고모'] 이런 식으로 추가할 수 있다.

remove 로 삭제 또한 가능하다. 벨류를 적어 사용(값에 의한 삭제)

del family[2] 이러한 삭제법도 존재한다. 인덱스를 적어 사용(순서에 의한 삭제)

index 함수로 몇 번째에 있는지 확인 가능하다.

in family 로 ‘엄마’, ‘할머니’ 가 존재하는지의 여부를 알 수 있다.

 

print()
aa = [1,2,3,['a','kbs','c'], 4, 5]
print(aa)
print(aa[0])
print(aa[3])
print(aa[3][1])

print(id(aa))
aa[0] = 333 # 요소값 수정 가능
print(aa, id(aa))


<console>
[1, 2, 3, ['a', 'kbs', 'c'], 4, 5]
1
['a', 'kbs', 'c']
kbs

2555252132672
[333, 2, 3, ['a', 'kbs', 'c'], 4, 5] 2555252132672

6번째 에 [3][1]은 배열 안의 배열에서 kbs 만 꺼내고 싶을 때 사용

순서별로 수정이 가능하다.

 

aa2 = ['123', '34', '234']
print(aa2)
aa2.sort()
print(aa2)
aa2.sort(key=int, reverse=True)
print(aa2)


<console>
['123', '34', '234']
['123', '234', '34']
['234', '123', '34']

sort 함수는 list를 정렬(일정한 규칙에 따라 나열)해주는 함수이다.

인자를 전달하지 않고 sort()를 호출하게 되면, 기본적으로 오름차순 정렬이 이루어다.

reverse=True를 사용하면 내림차순 정렬이 된다.

key 값을 넣으면 key 값을 기준으로 정렬된다. 위는 key 값이 int이기 때문에 숫자가 높은 순으로 정렬된 것이다.

 

name = ['소현', '현성', '다정']
print(name)
name2 = name # 얕은 복사 : 주소 치환
print(name2)
print(id(name), id(name2))

import copy
name3 = copy.deepcopy(name) # 깊은 복사, 새로운 객체로 생성
print(id(name), id(name2), id(name3))
name[0] = '용환'
print(name)
print(name2)
print(name3)


<console>
['소현', '현성', '다정']
['소현', '현성', '다정']
1825759579008 1825759579008

1825759579008 1825759579008 1825759666624
['용환', '현성', '다정']
['용환', '현성', '다정']
['소현', '현성', '다정']

치환으로 똑같은 주소를 가지게 된다. 얕은 복사라고도 부른다.

copy는 id값 즉, 사물함 키를 새로 만들어서 안에 있는 값들만 복사하는 것으로 깊은 복사라고 한다.

얕은 복사는 주소값이 같아서 하나를 변경해도 다 변경되지만, 깊은 복사는 내용은 같지만 주소가 다르기때문에 적용되지 않는다.

 

print("stack, queue")
#stack은 List in first out queue 는 First in First out
sbs = [1, 2, 3]
sbs.append(4)
print(sbs)
sbs.pop()
print(sbs)
sbs.pop()
print(sbs)
print()
sbs = [1, 2, 3]
sbs.append(4)
print(sbs)
sbs.pop(0)
print(sbs)
sbs.pop(0)
print(sbs)


<console>
stack, queue
[1, 2, 3, 4]
[1, 2, 3]
[1, 2]

[1, 2, 3, 4]
[2, 3, 4]
[3, 4]

pop 을 사용하면 맨 뒤쪽부터 1개씩 사라진다.

() 안에 인덱스를 넣으면 그 위치의 것이 적용된다.