Priv's Blog

6. 리스트와 튜플 본문

Dev. Study Note/Algorithm (Python)

6. 리스트와 튜플

Priv 2022. 1. 11. 21:40


 

 

1. 개별적으로 생성한 리스트의 동일성 판단하기

다음과 같이 2개의 리스트를 생성했다고 가정하자.

lst1 = [1, 2, 3, 4, 5]
lst2 = [1, 2, 3, 4, 5]

이 2개의 리스트를 다음과 같이 is 연산자로 동일성(identity)을 판단해보자.

lst1 is lst2

이 연산 결과는 False이다.

따로따로 생성한 리스트(튜플)의 경우, 리터럴이 아니기 때문에 서로 다른 식별 번호를 가진다.

또한 is 연산자는 이 식별 번호가 동일한 지를 판단하는 연산자이다.

 


 

2. 리스트(튜플)의 대입

이제 리스트 2개를 선언하여 서로 대입하면 어떻게 되는지 알아보자.

lst1 = [1, 2, 3]
lst2 = lst1

lst1[2] = 9

print(lst1)
print(lst2)

위의 결과는 다음과 같다.

[1, 2, 9]
[1, 2, 9]

리스트 2개를 선언하여 서로 대입하면, 원소 자체가 복사되는 것이 아니라 동일한 주소를 참조하는 것이다.

즉, lst2 = lst1을 통해 lst2 변수가 lst1의 주소를 가리키게 된 것이다.

 


 

3. 리스트(튜플) 스캔

문자열, 리스트, 튜플, 집합, 딕셔너리 등의 자료형 객체는 모두 이터러블(iterable) 객체이다.

이터러블 객체를 내장 함수 iter()의 인수로 전달하면, 반복자를 반환해 반복자의 __next__ 속성이나, next() 함수의 인수로 전달해 원소를 순차적으로 꺼내 준다.

for문을 사용할 때 등장하는 range() 함수나, enumerate() 함수 등이 대표적이다.

 


 

4. 함수 사이에 인수 주고받기

인수란, 함수가 전달받는 매개변수이며, 함수를 호출하는 곳에서 전달된다.

객체 참조에 의한 전달(Call by Object Reference)이란, 함수의 실행 시작 시점에 매개변수는 실제 인수와 같은 객체를 참조한다.

인수가 이뮤터블일 경우, 함수 안에서 매개변수의 값을 변경하면 다른 객체를 생성하고, 그 객체에 대한 참조로 업데이트하며, 호출하는 쪽의 실제 인수에 영향을 주지 않는다.

인수가 뮤터블일 경우, 함수 안에서 매개변수의 값을 변경하면 객체 자체를 업데이트하고, 호출하는 쪽의 실제 인수도 값이 변경된다.

def sum_1toN(n) :
    s = 0
    while (n > 0) :
        s += n
        n -= 1
        
    return s
    
 x = int(input("x의 값: "))
 print(f"1부터 {x}까지의 합: {sum_1toN(x)}")
def change(lst, idx, val) :
    lst[idx] = val
    
x = [11, 22, 33]
print(x)

ind = int(input("업데이트할 인덱스: "))
val = int(input("업데이트할 데이터: "))

change(x, ind, val)
print(x)

 


 

5. 리스트 원소

python에서 변수는 객체와 연결된 이름에 불과하다.

이러한 특징 때문에 리스트(튜플)에서도 원소 자료형을 미리 정할 필요가 없다.

x = [15, 64, 3.14, [1, 3], "ABC"]

for i in range(len(x)) :
    print(f"x[{i}] = {x[i]}")

 


 

6. 리스트 복사

python에서 리스트를 복사하는 방법으로는 얕은 복사깊은 복사가 있다.

얕은 복사란, 객체가 가지는 멤버의 값을 새로운 객체로 복사할 때, 객체가 참조 자료형의 멤버를 포함할 경우, 리스트는 별도로 생성하지만 참조값만 복사하기 때문에 내용이 동일한 복사이다.

깊은 복사란, 참조값과 참조하는 객체 자체를 재귀적으로 복사하여 객체가 가지는 모든 멤버(값과 참조 형식 등)를 복사한다.

 

6.1) copy() 함수

얕은 복사를 수행한다.

리스트 x가 참조하는 곳이 다르면, 리스트 y도 달라진다.

x = [1, 2, 3]
y = x.copy()

print(x)
print(y)

x[0] = 5

print(x)
print(y)


### RESULT ##
[1, 2, 3]
[1, 2, 3]
[5, 2, 3]
[5, 2, 3]

 

6.2) copy.deepcopy() 함수

구성 원소 수준으로 깊은 복사를 수행한다.

리스트의 원소와 원소의 원소(구성 원소)까지 복사한다.

import copy

x = [1, 2, 3]
y = x.copy.deepcopy(x)

x[0] = 9

print(x)
print(y)


### Result ###
[9, 2, 3]
[1, 2, 3]

 


 


수고하셨습니다!


 

'Dev. Study Note > Algorithm (Python)' 카테고리의 다른 글

8. 이진 검색  (0) 2022.01.13
7. 선형 검색  (0) 2022.01.11
5. 배열  (0) 2022.01.07
4. Python 변수  (0) 2022.01.04
3. 자료구조와 배열  (0) 2022.01.03
Comments