함수에 mutable 객체인 리스트를 아규먼트로 전달하는 경우에 대해 알아봅니다.
2023. 9. 2 최초작성
파이썬의 데이터 타입에는 값을 수정할 수 없는 Immutable 객체와 값을 수정할 수 있는 mutable 객체가 있습니다. immutable 객체에는 정수, 실수, 문자열, 튜플이 해당되며 mutable 객체에는 리스트와 딕셔너리가 해당됩니다.
immutable 객체는 값을 변경하면 다른 객체로 바뀌게 됩니다. 정수 객체를 코드로 살펴봅니다.
변수 a에 정수 객체 100을 대입합니다.
>>> a = 100
id 함수는 객체의 고유 식별자를 리턴하는데 객체의 데이터가 저장된 메모리 주소로 볼 수 있습니다.
>>> id(a)
4302575056
변수 a에 정수 객체 200을 대입합니다.
>>> a= 200
id 함수의 리턴값이 바뀌었습니다. 변수 a에 저장된 정수 객체의 메모리 주소가 바뀐 것입니다.
>>> id(a)
4302578320
주의할 점은 파이썬에선 변수에 메모리가 할당되는게 아니라 데이터에 메모리가 할당됩니다. 그래서 코드에서 정수 객체를 변수에 대입한다는 말을 한것입니다. 데이터에 메모리가 할당되기 때문에 변수에 mutable 객체인 정수 객체를 대입했다가도 다시 변수에 immutable 객체인 리스트 객체를 대입할 수 있습니다. immutable 객체 혹은 mutable 객체가 되는 대상은 변수가 아니라 데이터 자체입니다.
이번엔 mutable 객체인 리스트를 살펴봅니다.
변수 a에 리스트 객체를 대입하고 id 함수로 메모리 주소를 확인합니다.
>>> a=[1,2,3]
>>> id(a)
4305098560
변수 a에 다시 리스트 객체를 대입하고 리스트를 살펴봅니다. mutable 객체인 리스트의 경우엔 값이 수정가능하다고 했는데 메모리 주소가 변경되었습니다. 유의할점은 지금 새로운 리스트 객체를 변수 a에 대입한것은 리스트 객체를 수정한게 아니라 새로운 리스트 객체를 대입한거라서 그렇습니다.
>>> a=[3,4,5]
>>> id(a)
4305107968
리스트 객체를 수정하려면 append 메소드를 사용하여 값을 리스트 객체에 추가해야합니다. 지금은 메모리 주소가 바뀌지 않은 것을 확인할 수 있습니다.
>>> a.append(6)
>>> id(a)
4305107968
이제 함수에 아규먼트로 전달하는 경우를 살펴봅니다.
immutable 객체를 함수에 아규먼트로 넘겨주는 과정을 살펴봅니다.
함수 f를 정의합니다.
>>> def f(aa):
... print(id(aa))
... aa = 100
... print(id(aa))
...
변수 a에 정수 객체 10을 대입하고 메모리 주소를 확인합니다.
>>> a = 10
>>> id(a)
4302383696
함수 f에 정수 객체 10을 전달하면 함수 내에서 정수 객체 100을 대입하고 나서 메모리 주소가 변경됩니다.
>>> f(a)
4302383696
4302575056
함수 호출후에 변수 a에 있는 정수 객체의 값과 메모리 주소는 변화가 없습니다. 함수에서 새로운 정수 객체를 대입한 것이 영향을 주지 않기 때문입니다. immutable 객체의 경우엔 함수에 변수를 아규먼트로 전달하여 값을 변경했다면, 해당 변수를 리턴해야 합니다.
>>> a
10
>>> id(a)
4302383696
이번엔 mutable 객체를 함수에 아규먼트로 넘겨주는 과정을 살펴봅니다.
함수 f를 정의합니다.
>>> def f(aa):
... print(id(aa))
... aa.append(4)
... print(id(aa))
...
변수 a에 리스트 객체를 대입하고 메모리 주소를 확인합니다.
>>> a = [1,2,3]
>>> id(a)
4305107968
함수 f에 아규먼트로 리스트 객체 a를 전달 한 후, 리스트 객체에 4를 추가해도(리스트 객체를 수정해도) 메모리 주소가 변경되지 않은 것을 볼 수 있습니다.
>>> f(a)
4305107968
4305107968
함수에서 리스트 객체의 값을 변경한 것이 반영된것을 볼 수 있습니다. 리스트 객체에 함수내에서 수정한 것이 반영되었으며 메모리 주소도 이전과 동일합니다.
>>> a
[1, 2, 3, 4]
>>> id(a)
4305107968
'Python > Python 예제 코드' 카테고리의 다른 글
Python match case 예제 (0) | 2023.10.14 |
---|---|
OpenCV Python 강좌 – Affine Transformation (0) | 2023.10.12 |
파이썬 딕셔너리를 파일에 저장했다가 로드하는 예제 - pickle, json (0) | 2023.10.11 |
dask 사용해보기 (0) | 2023.10.11 |
Process, Thread, Main 함수 로그를 파일에 저장하는 logging Python 예제 (0) | 2023.10.11 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!