함수의 인수전달
- 인수는 객체를 자동으로 지역 변수 이름에 할당함으로써 전달된다.
- 함수 인수는 파이썬 할당의 또 다른 사례일 뿐이다.
- 참조는 포인터로 구현되기 때문에 결과적으로 모든 인수는 포인터에 의해 전달된다.
- 인수로 전달된 객체는 결코 자동으로 복사되지 않는다.
- 함수 안에서 가변 객체 인수를 변경하는 것은 호출자에게 영향을 줄 수 있다.
- 인수는 전달된 객체가 단순히 할당되기 때문에 함수는 전달된 가변 객체를 직접 변경할 수 있으며, 그 결과는 호출자에게 영향을 줄 수 있다.
- 불변인수는 실질적으로 '값에 의해' 전달된다.
- 정수나 문자열 같은 객체는 복사 대신에 객체 참조에 의해 전달되지만, 어쨌든 불변 객체를 직접 변경할 수 없기 때문에 그 결과는 복사한 것과 매우 유사해 진다.
- 가변 인수는 실질적으로 '포인터에 의해' 전달된다.
- 리스트나 딕셔너리와 같은 객체도 객체 참조에 의해 전달되는데, 이는 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() 이런식으로 접근 할 수도 있음