10.6 리스트 복사하기 (Copying Lists)
- 리스트에 있는 데이터를 복사하여 다른 리스트에 넣기 위해서 하나씩 복사하여야 한다.
- 아래와 같이 할당문(=)으로 복사할 수 있을 거라 생각하겠지만
list2 = list1
- 위 문법은 list1을 list2에 복사하는 문법이 아니다. 이는 단지 list1의 주소값을 list2에다 복사하는 것일 뿐이다.
*list2 = list1
*리스트 주소값 예제
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 |
<실행 결과>
*리스트 복사하기 예제
주소 복사
list1 = list(range(1, 10, 2)) list2 = list1 list1[0] = 111 print(list1) print(list2) | cs |
리스트 생성
list1 = list(range(1, 10, 2)) 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
※
본 게시물은 개인적인 용도로 작성된 게시물입니다. 이후 포트폴리오로 사용될 정리 자료이니 불펌과 무단도용은 하지 말아주시고 개인 공부 목적으로만 이용해주시기 바랍니다.
교재 영어 원서를 직접 번역하여 정리한 게시물이므로 일부 오타, 의역이 존재할 수 있습니다. 틀린 부분이 있다면 댓글로 알려주시면 감사하겠습니다.
※