본문 바로가기

공부/python

(python) 리스트3 - 리스트 복사하기, 리스트와 함수, 리스트 함축, 2차원 리스트

파이썬에서 리스트 변수는 리스트 객체를 직접 저장하고 있지 않다.

리스트 자체는 다른 곳에 저장되고 리스트의 참조값(reference)만 변수에 저장된다.

참조값은 메모리에서 리스트 객체의 위치이다.

우리가 리스트를 복사하려고 할 때는 이것을 약간 신경 써줘야 한다.

 

리스트 복사하기(얕은 복사)

리스트를 복사하기 위해 아래와 같은 문장을 실행하였다.

결론부터 말하자면 리스트는 복사되지 않았다. scores와 values는 모두 동일한

리소스 객체를 가리키고 있기 때문이다.

아래의 문장을 보면 알 수 있다.

아래의 사진을 보면 이해가 쉽다.

이것을 얕은 복사(shallow copy)라고 한다.

 

리스트 복사하기(깊은 복사)

위의 얕은 복사는 제대로된 복사 방법이 아니다.

올바른 리스트의 복사는 깊은 복사(deep copy)라고 한다.

 

깊은 복사의 방법에는 몇가지가 있는데 여기서는 하나만 다룬다.

바로 list() 메소드를 이용하는 것이다.

list() 내장 함수는 리스트를 받아서 복사본을 생성하여 반환한다.

위의 얕은 복사와 깊은 복사는 각자의 차이가 있으니 필요에 따라

사용하면 된다.

 

리스트와 함수

함수로 인수를 전달하는 방식에는 다음과 같은 2가지 방식이 있다.

  • "값으로 호출하기"(Call-by-Value): 함수로 변수를 전달할 때, 변수의 값이
    복사되는 방식이다.
  • "참조로 호출하기"(Call-by-Reference): 함수로 변수를 전달할 때, 변수의
    참조가 전달되는 방식이다. 함수에서 매개 변수를 통하여 원본 변수를 변경할
    수 있다.

파이썬에서는 어떤 방법을 사용할까? 아래를 보자

  • "값으로 호출하기" - 정수, 문자열, ... (변경 불가능한 객체)
  • "참조로 호출하기" - 리스트, ... (변경 가능한 객체)

"값으로 호출하기"방식은 객체의 참조값이 함수의 매개 변수로 전달되지만 함수

안에서 객체의 값을 변경하면 새로운 객체가 생성되기 때문이다.

"참조로 호출하기"방식은 리스트는 함수 안에서 변경할 수 있기 때문에 참조값으로

전달된다. 즉 리스트의 요소들은 변경될 수 있다.

 

먼저 "값으로 호출하기"방식의 예를 보자.

x의 값을 변경해도 y의 값은 영향받지 않는다.

func1()안에서 매개 변수 x의 값을 변경하면 새로운 객체가 생성되어서 x에 참조값이

저장된다.

다음으로 "참조로 호출하기"방식을 보자.

변경가능한 객체인 리스트를 함수에 전달하면 참조값으로 전달된다.

리스트는 함수 안에서 변경될 수 있으니, 리스트의 요소들도 변경될 수 있다.

func2()에서 리스트 안의 첫 번째 요소를 99로 바꾸었다.

print()로 실행된 결과를 보면 원본 리스트도 변경된 것을 알 수 있다.

리스트 함축

리스트 함축은 수학자들이 집합을 정의하는 것과 유사하다.

파이썬에서 리스트를 수학과 유사하게 정의할 수 있는데 아래의 예를 보자.

  •  x**2는 새로운 리스트의 요소를 생성하는 출력식이다.
  • x는 입력 리스트의 요소를 나타내는 변수이다.
  • range(10)은 입력 리스트를 나타낸다.
  • [ ]은 결과가 새로운 리스트라는 것을 의미한다.

만약 리스트 함축을 사용하지 않으면 아래와 같이 반복문을 사용해야 할 것이다.

 

리스트 함축은 다음과 같은 형식을 가진다.

리스트 함축을 사용하면 아주 간결하게 리스트를 생설할 수 있다는 큰 장점이 있다.

 

간단한 예를 보자.

 

조건이 붙는 리스트 함축

리스트 함축에는 if를 사용하여 조건이 추가될 수 있다.

  • x는 출력식이다.
  • range(10)은 입력 리스트이다.
  • if x % 2 == 0은 조건이다.

2차원 리스트

2차원 리스트는 1차원 리스트의 모임으로 구성된다.

파이썬에서는 리스트를 2차원으로 만들 수 있다. 이건 다른 언어도 마찬가지이다.

2차원 리스트를 생성해보았다.

제일 위의 코드에서 리스트 [1,2,3,4,5]가 첫 번째 행이고,

리스트 [6,7,8,9,10]이 두 번째 행이다.

 

s리스트에서 0번 행, 3번 열에 위치한 값은 4이고,

s리스트에서 2번 행, 1번 열에 위치한 값은 12이다.

 

동적으로 2차원 리스트 생성

위의 2차원 리스트는 초기값이 미리 결정되어있다.

하지만, 실제로는 동적으로 2차원 리스트를 생성하는 경우가 많다.

아래의 예를 보자.

 

2차원 리스트 요소 접근

2차원 리스트에서 요소에 접근하려면 2개의 인덱스 번호를 지정하여야 한다.

첫 번째 번호가 행 번호이고, 두 번째 번호가 열 번호가 된다.

2차원 리스트에 저장된 모든 값을 출력하려면 다음과 같이 이중 루프를 사용해야 한다.