[파이썬] 리스트 다루기

22762 단어 pythonpython

출처 - 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]]

좋은 웹페이지 즐겨찾기