티스토리 뷰

10.6 리스트 복사하기 (Copying Lists)

- 리스트에 있는 데이터를 복사하여 다른 리스트에 넣기 위해서 하나씩 복사하여야 한다.

- 아래와 같이 할당문(=)으로 복사할 수 있을 거라 생각하겠지만

list2 = list1

- 위 문법은 list1을 list2에 복사하는 문법이 아니다. 이는 단지 list1의 주소값을 list2에다 복사하는 것일 뿐이다.

 

*list2 = list1

 

 

*리스트 주소값 예제

1
2
3
4
5
6
7
8
9
10
list1 = [1,2]
list2 = [3,4,5]
print("list1's ID = ",id(list1))
print("list2's ID = ",id(list2),"\n")
 
print("After the assignment statement:")
list2 = list1
 
print("list1's ID = ",id(list1))
print("list2's ID = ",id(list2))
cs

 

<실행 결과>

 

*리스트 복사하기 예제

주소 복사

1
2
3
4
5
list1 = list(range(1102))
list2 = list1
list1[0= 111
print(list1)
print(list2)
cs

리스트 생성 

1
2
3
4
5
list1 = list(range(1102))
list2 = [] + list1 
list1[0= 111 
print(list1)
print(list2)
cs

 

10.7 함수에 리스트 전달하기(Passing Lists to Functions)

- 리스트를 함수에 전달 할 때, 리스트의 내용물은 함수 호출 이후에 바뀔 수 있다. 즉 리스트는 가변적인 객체(mutable object)이다.

- 리스트는 객체(object)이기 때문에, 함수에 일반 객체를 전달하듯이 리스트를 함수에 전달하면 된다.

 

*사용 형식

def printList(lst):

for element in lst:

print(element)

 

- 위 함수를 아래와 같이 전달 가능하다.

 

printList([3,1,2,6,4,2])

*tip : 위 명령문은 리스트를 만들어 전달하지만 명시적인 주소 변수(reference value)가 없는 상태이다. 이를 익명 리스트(anonymous list)라고 부른다.

 

- 리스트는 가변 객체(mutable object)이기 때문에 함수 내부에서 내용물이 바뀔 수 있다.

 

*리스트 함수 호출 예제(PassListArgument.py)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def main():
    x = 1
    y = [1,2,3]
 
    m(x,y)
 
    print("x is ",x)
    print("y[0] is ",y[0])
 
def m(number,numbers):
    number = 1001
    numbers[0= 5555
 
main()
cs

>>

 

- m(numuber, numbers)함수의 number은 불가변적, numbers는 가변적 객체이므로 x는 함수 밖에서는 1인 상태로 바뀌지 않는다.

 

- 그리고 디폴트 리스트(a list as a default argument)를 다룰 때 또 다른 문제점이 있다.

* 디폴트 리스트 함수 호출 예제(DefaultListArgument.py)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def add(x, lst = []):
    if x not in lst:
        lst.append(x)
 
        return lst
 
def main():
    list1 = add(1)
    print(list1) 
 
    list2 = add(2)
    print(list2) 
 
    list3 = add(3,[11,12,13,14])
    print(list3) 
 
    list4 = add(4)
    print(list4) 
 
main()
cs

<실행 결과>

 

- Lint 8 에서, 디폴트 값(default value) '[ ]'으로 함수의 인자(argument) lst가 생성되었다.

- 디폴트 값은 오직 한번만 생성되며, add(1)은 lst에 1을 추가한다.

- Line 11 에서 한번 더 함수가 호출 될 때 lst는 [ ]가 아닌 [1]이다.

- 그래서 호출 한 뒤에 lst는 [1,2]가 된다.

- Line 14 에서는 리스트 요소[11, 12, 13, 14]가 주어져있다. 그리고 이 리스트가 lst로 전달 된다.

- 만약 디폴트 리스트('[ ]')를 매 함수를 호출할 때 마다 사용하고 싶다면 아래와 같이 수정해야 한다.

 

*디폴트 리스트 예제(DefaultNoneListArgument.py)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def add(x, lst = None):
    if lst == None:
        lst = []
    if x not in lst:
        lst.append(x)
        
    return lst
 
def main():
    list1 = add(1)
    print(list1) 
 
    list2 = add(2)
    print(list2) 
 
    list3 = add(3,[11,12,13,14])
    print(list3) 
 
    list4 = add(4)
    print(list4) 
 
main()
cs

 

<실행 결과>

 

- Line 3는, add 함수가 호출될 때 마다 리스트 인자 없이 새로운 빈 리스트를 생성한다.

- 만약 리스트 인자가 주어 진다면, 함수가 호출 될 때 디폴트 리스트는 사용되지 않는다.

 

참고 문헌 : Introduction to Programming Using Python / Y.DANIEL LIANG



본 게시물은 개인적인 용도로 작성된 게시물입니다. 이후 포트폴리오로 사용될 정리 자료이니 불펌과 무단도용은 하지 말아주시고 개인 공부 목적으로만 이용해주시기 바랍니다.


교재 영어 원서를 직접 번역하여 정리한 게시물이므로 일부 오타, 의역이 존재할 수 있습니다. 틀린 부분이 있다면 댓글로 알려주시면 감사하겠습니다. 

댓글