반응형

함수에 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





반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts