python 헷갈리는 개념 정리

석헌주·2021년 12월 4일
0

함수의 인수전달

  • 인수는 객체를 자동으로 지역 변수 이름에 할당함으로써 전달된다.
    • 함수 인수는 파이썬 할당의 또 다른 사례일 뿐이다.
    • 참조는 포인터로 구현되기 때문에 결과적으로 모든 인수는 포인터에 의해 전달된다.
    • 인수로 전달된 객체는 결코 자동으로 복사되지 않는다.
  • 함수 안에서 가변 객체 인수를 변경하는 것은 호출자에게 영향을 줄 수 있다.
    • 인수는 전달된 객체가 단순히 할당되기 때문에 함수는 전달된 가변 객체를 직접 변경할 수 있으며, 그 결과는 호출자에게 영향을 줄 수 있다.
  • 불변인수는 실질적으로 '값에 의해' 전달된다.
    • 정수나 문자열 같은 객체는 복사 대신에 객체 참조에 의해 전달되지만, 어쨌든 불변 객체를 직접 변경할 수 없기 때문에 그 결과는 복사한 것과 매우 유사해 진다.
  • 가변 인수는 실질적으로 '포인터에 의해' 전달된다.
    • 리스트나 딕셔너리와 같은 객체도 객체 참조에 의해 전달되는데, 이는 c에서 배열을 포인터로 전달하는 방식과 유사하다. 가변 객체는 c의 배열처럼 함수 내에서 직접 변경할 수 있다.
  • 인수로 리스트나 딕셔너리와 같은 가변 객체가 전달될 경우에는 호출된 함수에서 그러한 객체에 가해진 변경 내역은 함수가 종료된 후에도 계속 유지되며, 따라서 호출자에게 영향을 준다는 점을 알아야 할 필요가 있다.

불변타입, 가변타입

  • 불변타입
    • 숫자, 문자열, 튜플
  • 가변타입
    • 리스트, 딕셔너리, 집합(셋)

시퀀스 sequence

  • 위치적으로 정렬된 객체의 컬렉션
  • 문자열, 리스트, 튜플이 시퀀스에 해당됨
  • 이들은 인덱싱, 연결(+), 슬라이싱과 같은 공통의 시퀀스 연산을 공유하지만, 각각은 타입별 메서드 호출을 가지고 있다.
  • 관련된 용어인 '반복 객체(iterable)'는 요청 시에 시퀀스의 아이템을 생성하는 물리적인 시퀀스, 또는 가상의 시퀀스를 말한다.

딕셔너리에서 key값으로 올 수 있는 것들

immutable type의 객체는 무엇이든 가능하다.

  • immutable - int, string, tuple
  • mutable - lis, dict, set

python _example __example__ __example 쓰임세와 차이점

https://dbader.org/blog/meaning-of-underscores-in-python

끝판왕으로 정리를 잘 해놓은 글

https://stackoverflow.com/questions/1301346/what-is-the-meaning-of-single-and-double-underscore-before-an-object-name

스택오버플로우에 관련 답변이 상세하게 잘 나와 있다.

https://mingrammer.com/underscore-in-python/

한글로 작성된 블로그에도 잘 정리되어 있음

__foo__

  • 매직 메서드라고도 한다.
  • python의 buildin method를 의미하며 관련 내용을 override 할 때 사용한다.

_foo

  • 모듈이나, 클래스 내부에서 사용한다는 의미를 가지고 있고 실제 해당 이름으로 접근은 가능
  • 모듈에서는 조금 다르게 동작하긴 한다.
>>> t = Test()
>>> t.foo
11
>>> t._bar
23

>>> from my_module import *
>>> external_func()
23
>>> _internal_func()
NameError: "name '_internal_func' is not defined"

>>> import my_module
>>> my_module.external_func()
23
>>> my_module._internal_func()
42

__foo

  • 내부적으로 interpreter가 _classname__foo 이런 식으로 이름을 변경 한다.
  • 이런식으로 변경 함으로써 같은 이름을 가지더라도 인스턴스에 따라서 명확하게 다른 동작을 할 수 있도록 지정 할 수 있음.
  • 예를들어 A class와 A class를 상속 받은 B class가 있다고 가정하자. A 에도 foo()가 있고 B에도 foo()가 있을 때 B.foo()는 A.foo()를 override하게 된다. 만약에 __foo() 로 선언했다면 B의 인스턴스만 B.foo()에 접근 할 수 있다. 다른방법으로 접근하려면 super(B).foo() 이런식으로 접근 할 수도 있음
profile
백엔드 개발자

0개의 댓글