[파이썬] 리스트 다루기
출처 - https://wikidocs.net/16037
1. list란?
- 순서가 있는 수정 가능한. 객체의 집합(mutable)
- 수정, 삭제, 추가가 가능한.
- list는 []로 작성되어지며, 내부 원소는 ,로 구분된다.
2. list indexing
- 파이썬에서 리스트 인덱싱은 음수도 허용을 한다.
- 음수값은 역순으로도 인덱싱된다.
s = 'show how to index into sequences'.split()
>>> s
['show', 'how', 'to', 'index', 'into', 'sequences']
>>> s[0]
'show'
>>> s[5]
'sequences'
>>> s[-1]
'sequences'
>>> s[-2]
'into'
>>> s[-6]
'show'
3. list slicing
- 사용법은 리스트변수[시작인덱스:종료인덱스:step]이다.
- 음수 인덱싱도 슬라이싱에 사용할 수 있다.
>>> s[1:-1]
['how', 'to', 'index', 'into']
- step을 이용해서 reverse를 할 수 있다.
>>> s = 'show how to index into sequences'.split()
>>> s
['show', 'how', 'to', 'index', 'into', 'sequences']
>>> s[::-1]
['sequences', 'into', 'index', 'to', 'how', 'show']
4. mutable객체와 immutable객체
4-1. mutable한 객체의 변수 간 대입
- list의 얕은 복사를 확인
- b에 a를 할당하면 값이 할당되는 것이 아니라 같은 메모리 주소를 바라본다.
- b를 변경하면 a도 같이 바뀐다.
>>> a = [1, 2, 3]
>>> b = a # shallow copy
>>> b[0]= 5
>>> a
[5, 2, 3]
>>> b
[5, 2, 3]
>>> id(a)
4396179528
>>> id(b)
4396179528
4-2. immutable한 객체의 변수간 대입
- str 문자열의 얕은 복사를 확인
- b를 a에 할당하면 같은 메모리 주소를 바라보게 된다.
- 그러나 b에 다른 값을 할당하면 재할당이 이루어지며 메모리 주소가 변경된다.
- a와 b는 다른 값을 가지게 된다.
>>> a = "abc"
>>> b = a
>>> a
'abc'
>>> b
'abc'
>>> id(a)
4387454680
>>> id(b)
4387454680
>>> b = "abcd"
>>> a
'abc'
>>> b
'abcd'
>>> id(a)
4387454680
>>> id(b)
4396456400
5.얕은 복사(shallow copy)
- list의 slicing을 이용해서 할당
>>> a = [1,2,3]
>>> b = a[:]
>>> id(a)
4396179528
>>> id(b)
4393788808
>>> a == b
True
>>> a is b
False
그러나, 이러한 슬라이싱 또한 얕은 복사에 해당한다.
- 리스트 안에 리스트, mutable객체 안에 mutable객체인 경우 문제가 된다.
>>> a = [[1,2], [3,4]]
>>> b = a[:]
>>> id(a)
4395624328
>>> id(b)
4396179592
>>> id(a[0])
4396116040
>>> id(b[0])
4396116040
#재할당 -> 문제 없음
>>> a[0] = [8,9]
>>> a
[[8, 9], [3, 4]]
>>> b
[[1, 2], [3, 4]]
#값을 변경 -> a와b가 함께 바뀐다.
a[1].append(5)
>>> a
[[8, 9], [3, 4, 5]]
>>> b
[[1, 2], [3, 4, 5]]
재할당 하는 경우에는 문제가 없지만, 리스트안의 리스트 요소를 수정(추가, 변경) 하는 경우에는 b도 같이 변경이 된다.
- copy 모듈의 copy메소드 또한 얕은 복사
>>> import copy
>>> a = [[1,2],[3,4]]
>>> b = copy.copy(a)
>>> a[1].append(5)
>>> a
[[1, 2], [3, 4, 5]]
>>> b
[[1, 2], [3, 4, 5]]
6. 깊은 복사(deep copy)
- copy.deepcopy()를 사용한다.
>>> import copy
>>> a = [[1,2],[3,4]]
>>> b = copy.deepcopy(a)
>>> a[1].append(5)
>>> a
[[1, 2], [3, 4, 5]]
>>> b
[[1, 2], [3, 4]]
Author And Source
이 문제에 관하여([파이썬] 리스트 다루기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@isg/파이썬-리스트-다루기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)