본문 바로가기
Python 코딩도장

파이썬 코딩도장 Unit 22 정리(2) : 리스트

by chanfficial 2022. 1. 19.

2. 리스트 할당, 복사

  • 할당과 복사는 비슷한 것 같지만 큰 차이점이 있다.
  • b=a와 같이 리스트(a)를 다른 변수(b)에 할당하면 리스트가 두 개가 될 것 같지만 실제로 리스트는 하나이다.
    >>> a = [0, 0, 0, 0, 0]
    >>> b = a # 리스트를 다른 변수에 할당
    >>> a is b
    True​
  • a와 b를 is 연산자로 비교하면 True가 나오므로, 변수의 이름만 다를 뿐 리스트 a와 b는 같은 객체임을 알 수 있다.
  • a와 b는 같기 때문에 b[2] = 99 처럼 리스트 b의 요소를 변경하면 리스트 a와 리스트 b에 모두 반영된다.
    >>> b[2] = 99
    >>> a
    [0, 0, 99, 0, 0]
    >>> b
    [0, 0, 99, 0, 0]​
  • 리스트 a와 b를 완전히 두 개로 만들려면 copy 메서드로 모든 요소를 복사해야 한다.
  • b = a.copy()와 같이 copy를 사용한 뒤 b에 할당해주면 리스트 a의 요소가 모두 b에 복사된다.
    >>> a = [0, 0, 0, 0, 0]
    >>> b = a.copy() # a를 copy해서 b에 할당​
  • a와 b를 is 연산자로 비교해보면 False가 나오므로 두 리스트는 다른 객체이지만, 복사된 요소는 모두 같아서 ==로 비교하면 True가 나온다.
    >>> a is b
    False
    >>> a == b
    True​
  • 리스트 a와 b는 별개이므로 한쪽의 값을 변경해도 다른 리스트에 영향을 미치지 않아서 리스트 b의 요소를 변경하면 리스트 a는 그대로이고 b만 바뀐다.
    >>> b[2] = 99
    >>> a
    [0, 0, 0, 0, 0]
    >>> b
    [0, 0, 99, 0, 0]​

 

 

3. 반복문으로 리스트의 요소를 모두 출력하기

3-1. for 반복문으로 요소 출력하기

  • for 반복문은 in 뒤에 리스트를 지정하면 된다.
    # for 변수 in 리스트:
    #   반복할 코드
    
    >>> a = [38, 21, 53, 62, 19]
    >>> for i in a: # for로 리스트 a의 모든 요소를 출력
    ...     print(i)
    ...
    38
    21
    53
    62
    19​
  • 'for i in a:' 는 리스트 a에서 요소를 꺼내서 i에 저장하고 꺼낼 때마다 코드를 반복하기 때문에 print로 i를 출력하면  모든 요소를 순서대로 출력할 수 있다.
    for i in [38, 21, 53, 62, 19]:
        print(i)​
  • 이렇게 in 다음에 리스트를 직접 지정해도 괜찮다.

 

3-2. 인덱스와 요소를 함께 출력하기

  • for 반복문으로 요소를 출력할 때 인덱스도 함께 출력하려면 enumerate를 사용한다.
    # for 인덱스, 요소 in enumerate(리스트)
    >>> a = [38, 21, 53, 62, 19]
    >>> for index, value in enumerate(a):
    ...     print(index, value)
    ...
    0 38
    1 21
    2 53
    3 62
    4 19​
  • for index, value in enumerate(a):와 같이 enumerate에 리스트를 넣으면 for 반복문에서 인덱스와 요소를 동시에 꺼내 올 수 있다.
  • 인덱스를 1부터 출력하고 싶다면 index + 1을 출력하면 된다.
    >>> for index, value in enumerate(a):
    ...     print(index + 1, value)
    ...
    1 38
    2 21
    3 53
    4 62
    5 19
  • 좀 더 파이썬 다운 방법에는 enumerate에 start를 지정해 주는 것이다.
    # for 인덱스, 요소 in enumerate(리스트, start=숫자):
    >>> for index, value in enumerate(a, start=1):
    ...     print(index, value)
    ...
    1 38
    2 21
    3 53
    4 62
    5 19​
    - enumerate(a, start=1)처럼 start에 1을 지정하여 인덱스가 1부터 시작하도록 했고, 이 코드는 enumerate(a, 1)로 줄여 쓸 수도 있다.

※ for에 리스트를 지정하면 요소를 바로 가져와서 편리한 것 처럼 for에서 인덱스를 지정하여 요소를 가져올 수도 있다.

이때는 range에 len으로 리스트의 길이(요소 개수)를 구해서 넣어주면 인덱스를 순서대로 만들어줘서 a[i]와 같이 리스트에 인덱스를 지정하여 값을 가져올 수 있다.

>>> a = [38, 21, 53, 62, 19]
>>> for i in range(len(a)):
...     print(a[i])
...
38
21
53
62
19

- for i in range(len(a))를 실행하면 i 에는 요소가 아닌 0부터 마지막 인덱스까지 인덱스가 들어간다.

 

 

3-2. while 반복문으로 요소 출력하기

  • while 반복문으로 리스트의 요소를 출력할 때는 변수 i를 인덱스로 활용한다.
  • 먼저 변수 i를 0으로 만들어주고, i < len(a) 처럼 i 가 리스트의 길이(요소 개수) 직전까지만 반복하도록 한다.
    >>> a = [38, 21, 53, 62, 19]
    >>> i = 0
    >>> while i < len(a):
    ...     print(a[i])
    ...     i += 1
    ...
    38
    21
    53
    62
    19​
  • 리스트의 인덱스는 0부터 시작하고 마지막 인덱스는 리스트의 길이보다 1이 작으므로 < 를 사용한다.
  • 만약 i <= len(a) 처럼 <= 을 사용하면 리스트의 범위를 벗어나므로 주의해야 한다.
    >>> a = [38, 21, 53, 62, 19]
    >>> i = 0
    >>> while i <= len(a):
    ...     print(a[i])
    ...     i += 1
    ...
    38
    21
    53
    62
    19
    Traceback (most recent call last):
      File "<stdin>", line 2, in <module>
    IndexError: list index out of range​
  • while 반복문 안에서 요소를 출력할 때는 print(a[i])와 같이 리스트의 인덱스 부분에 i 를 지정하여 출력하고, 그 다음에는 i 가 1씩 증가하도록 만든다.
    while i < len(a):
        print(a[i])
        i += 1​