Python 은 명시적인 Call by Reference 혹은 Call by Value 라는 개념이 존재하지 않는다.


Python의 function에 argument 를 전달할 때, 이는 Manual 에 따르면 call by assignment 라는 방식으로 전달된다. 


이는 Parameter로 전달받는 객체에 따라 객체의 참조방식이 결정된다는 의미로, 공식 문서에 따르면 Mutable Object 는 Call by reference의 형태로 참조형으로 변수를 다루며 Immutable Object는 Call by value 의 형태로 변수를 핸들링한다.


- Mutable Object : list, dict, set 등의 객체


- Immutable Object : str, int, tuple 등의 객체


가령 다음과 같은 코드는 전달되는 객체에 따라 파이썬이 변수를 어떻게 핸들링하는 지를 간단하게 보여준다.




출력 결과는 다음과 같다. 

foo 함수의 경우 int 형을 핸들링하기 때문에 call by value 로 새로 변수를 할당해서 처리하는 모습을 보여주고 list 를 입력받은 foo2 함수의 경우 call by reference 로 전달 받은 객체를 직접 변경하는 모습을 볼 수 있다.




'Programming Language > Python' 카테고리의 다른 글

Python 의 Package 와 __all__ 키워드  (0) 2018.09.25
Python 2 버전과 3 버전의 차이  (0) 2018.08.04


파이썬은 모듈 혹은 모듈의 집합을 패키지 단위로 묶어서 관리할 수 있고 이는 소스 트리를 구축하는데 있어서 매우 유용한 기법이다

패키지는 도트(.)를 이용해서 파이썬 모듈을 계층적으로 관리할 수 있게 해준다


2.x 버전 및 그 하위의 레벨에서는 반드시 패키지 폴더 내부에 __init__.py 라는 파일이 존재하게 되는데, 이 파일은 해당 디렉토리가 패키지의 일부임을 알려주는 역할을 한다

만약 패키지에 포함된 디렉토리 중 __init__.py 파일이 없다면 패키지로 인식되지 않는다

3.x 이후의 버전에서는 __init__.py 가 없더라도 패키지로 인식이 가능하게 변경되었으나, 하위 버전 호환을 위해서 __init__.py 파일을 생성하는 것이 안전한 방법이다


__init__.py를 이용할 경우 해당 파일 내에 __all__ 변수를 설정해서 외부에서 import 가능한 모듈을 정의해주어야 한다.

그렇지 않으면 하위 버전에서는 import *를 하게 되더라도 해당 모듈을 사용하지 못하게 될 수도 있다

(하지만 from 의 마지막 항목이 모듈인 상태로 import *를 하게 되면 이에 상관없이 전부 사용이 가능하다. 여기서 안 된다고 하는건 패키지를 대상으로 import *를 하게 되는 경우를 말한다.) 


__all__ 변수는 다음과 같이 모듈의 이름을 담는 리스트로 구성되며 as를 이용해서 다른 변수명으로 치환해서 사용되곤 한다.

__all__ = [‘moduleA’, ‘moduleB’] as moduleAll



'Programming Language > Python' 카테고리의 다른 글

Python 의 Call by assignment 의 개념  (0) 2018.10.07
Python 2 버전과 3 버전의 차이  (0) 2018.08.04


 Python2 3 간에는 생각보다 backward compatibility 를 지원하지 않는 경우가 많은데,

가령 차이점으로는 다음과 같은 것들이 있다.


-      Python3 부터는 모든 변수가 객체(Object)로 처리된다.

-      Python3 에서는 xrange를 지원하지 않는다. Python2 xrange는 정해진 숫자만큼 object를 생성하는 lazy process 방식이고 looping 동작에서 memory efficient 를 갖는다. 그러나 3부터는 모두 range를 사용하며 대체가 불가능하다.

-      Python3 에서 연산은 자동 타입할당이 제공된다.

-      Python3 에서 print 문은 함수로써 동작하므로 괄호가 필수이다.

-      Python3 에서 기존 Python2 long Int로 통일되었다.


그 외에도 유니코드 및 에러 핸들링 부분에서 차이가 있으며, 자세한 건 다음 링크의 설명이 도움이 될 수 있다.


https://www.geeksforgeeks.org/important-differences-between-python-2-x-and-python-3-x-with-examples/



'Programming Language > Python' 카테고리의 다른 글

Python 의 Call by assignment 의 개념  (0) 2018.10.07
Python 의 Package 와 __all__ 키워드  (0) 2018.09.25

+ Recent posts