Java에서는, 문자열 객체가 생성될 때마다 새로운 주소를 할당하는 방식을 사용합니다. 그러나 Python의 경우 문자열 객체 생성 시 매번 새로운 객체를 만드는 대신 기존에 선언되어 있던 immutable 객체를 사용합니다. 이는 CPython의 최적화 기법string interning에 의한 동작입니다. 따라서 둘 이상의 변수메모리의 동일한 문자열 객체를 가리킬 수 있고, 메모리를 절약하게 됩니다.

string interning의 규칙

string interning 최적화에는 몇가지 규칙이 있습니다.

  • 길이가 0 또는 1인 문자열은 intern
  • 컴파일 타임에만 intern : 동적으로 문자열을 만들어내는 경우(포맷팅 등) intern되지 않음
  • ASCII 문자, 숫자 또는 언더스코어가 아닌 문자가 속해 있는 경우(!, ? 등) intern되지 않음

'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] Decorator  (0) 2018.07.21
[Python] Closure  (0) 2018.07.20
[Python] 함수 인자의 기본값 평가  (0) 2018.07.14
[Python] @property와 setter  (0) 2018.07.13
[Python] Keyword exclusive argument  (0) 2018.07.11

Python에서 함수의 인자는 아래처럼 4가지로 나뉩니다.

  • 필수 인자
  • 선택 인자
  • 가변 위치 인자 튜플
  • 가변 키워드 인자 딕셔너리

여기서 알아보고자 하는 건, 인자의 기본값입니다. Python에서 함수의 인자에는 기본값을 설정할 수 있고, 꽤 유용하게 사용할 수 있습니다.

그러나 Python에서 함수 인자의 기본값은 단 한 번만 평가됩니다. 따라서, 아래와 같은 함수는 예상 외의 결과를 만들어 냅니다.

log 함수에 at 인자가 전달되지 않을 경우 '현재 시간'으로 인자를 채우도록 하려는 의도였으나, 두 번의 함수 호출에 대한 at 인자의 값이 동일합니다. Python의 함수는 인자의 기본값 평가를 최초 한 번만 수행하기 때문입니다. 따라서 아래와 같이 함수를 작성하는 것이 좋습니다.

기본값을 None으로 두고, 함수 내부의 if문에서 값을 채워주는 방식입니다.

'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] Closure  (0) 2018.07.20
[Python] 문자열의 메모리 할당 방식  (0) 2018.07.19
[Python] @property와 setter  (0) 2018.07.13
[Python] Keyword exclusive argument  (0) 2018.07.11
[Python] 입출력  (0) 2018.07.10

객체지향 프로그래밍 패러다임에는 캡슐화라는 개념이 있습니다. 객체가 가진 속성들에 대한 접근을 제한하는 것인데, Java의 경우에는 private같은 접근 지정자와 getter/setter를 예로 들 수 있습니다. Python도 객체지향을 지원하며, 요소에 대한 접근 제한도 언더스코어를 통해 간접적으로 지원합니다.

그러나 이는 언어 자체(인터프리터 단위)에서 제약하는 진정한 의미의 접근 제한은 아니며, 컨벤션에 의한 표현법에 불과합니다. 객체의 필드에 대한 별도의 제약이 필요하면 property를 사용할 수 있습니다.

+ Recent posts