The presentation slides for PyCon Korea 2019 session that is talking about Python Variable. It will compare the difference between immutable/mutable, class/instance, global/nonlocal/local variables.
2. – 16년차 소프트웨어 엔지니어
– PyCon Korea 2017 연사 (Python vs Java)
– (현) Elastic Sr. Support Engineer & Solutions Tech Lead
– (전) 두산중공업 Digital Innovation SW Architect & Agile Evangelist
– (전) 삼성SDS 프레임워크 팀 SW Architect & Engineer
– (전) 현대정보기술 해외금융기술팀SW Engineer
조인석 (Chris Cho)
3. 강의 목표
● 변할 수 없는immutable
변수와 변할 수 있는mutable
변수의 차이점을 이해한다.
● 클래스class
변수와 인스턴스instance
변수의 차이점을 이해한다.
● 글로벌global
변수, 로컬local
변수와 논로컬nonlocal
변수의 차이점을 이해한다.
● 좋은 소스 코드를 작성하는데 도움이 되는 적합한 변수를 선택할 수 있다.
● 좋은 프로그래머가 되기 위한 기본 소양을 갖춘다.
4. 강의 목표
● 변할 수 없는immutable
변수와 변할 수 있는mutable
변수의 차이점을 이해한다.
● 클래스class
변수와 인스턴스instance
변수의 차이점을 이해한다.
● 글로벌global
변수, 로컬local
변수와 논로컬nonlocal
변수의 차이점을 이해한다.
● 좋은 소스 코드를 작성하는데 도움이 되는 적합한 변수를 선택할 수 있다.
● 좋은 프로그래머가 되기 위한 기본 소양을 갖춘다.
● [NOT] 파이썬 내부 동작 원리를 깊이 이해한다.
5.
6.
7.
8. 컴퓨터의 기본 동작 원리와 변수의 역할
‘변수’는 데이터를 메모리에
저장할 때 물리적인 메모리 주소
대신 사용하는 기억하기 쉬운
단어로 구성된 꼬리표. 물리적인
메모리 주소는 항상 바뀔 수 있다.
https://brunch.co.kr/@insuk/4
9. 동적 바인딩 (Duck Typing) & 강한 타입 언어
http://geek-and-poke.com/geekandpoke/2014/10/26/duck-typing-dogfooding https://pedrorijo.com/blog/strings-as-types/
20. Programmer 클래스 정의
class Programmer:
languages = [] # 클래스 변수 선언
def __init__(self, name): # 초기화 함수 재정의
self.name = name # 인스턴스 변수 선언 및 초기화
def add_lang(self, lang):
self.languages.append(lang) # 클래스 변수 값 변경
21. >>> chris = Programmer('Chris Cho')
>>> chris.add_lang('Python')
>>> chris.add_lang('Java')
>>> chris.name
'Chris Cho'
>>> chris.languages
['Python', 'Java']
>>> ujin = Programmer('Ujin Cho')
>>> ujin.name
'Ujin Cho'
>>> ujin.languages
??? ???
언어 추가 X
한번 맞춰 보세요!!
22. >>> chris = Programmer('Chris Cho')
>>> chris.add_lang('Python')
>>> chris.add_lang('Java')
>>> chris.name
'Chris Cho'
>>> chris.languages
['Python', 'Java']
>>> ujin = Programmer('Ujin Cho')
>>> ujin.name
'Ujin Cho'
>>> ujin.languages
['Python', 'Java']
언어 추가 X
한번 맞춰 보세요!!
23. >>> chris = Programmer('Chris Cho')
>>> chris.add_lang('Python')
>>> chris.add_lang('Java')
>>> chris.name
'Chris Cho'
>>> chris.languages
['Python', 'Java']
>>> ujin = Programmer('Ujin Cho')
>>> ujin.name
'Ujin Cho'
>>> ujin.languages
['Python', 'Java']
언어 추가 X
한번 맞춰 보세요!!
24. Programmer 클래스 제대로 정의
class Programmer:
def __init__(self, name):
self.name = name
self.languages = []
def add_lang(self, lang):
self.languages.append(lang)
class Programmer:
languages = []
def __init__(self, name):
self.name = name
def add_lang(self, lang):
self.languages.append(lang)
25. 정리해 볼까요?
‘클래스 변수’ :
클래스에 의해 생성된 모든 객체가 같은 값을 조회할 때 사용하는 변수
‘인스턴스 변수’ :
인스턴스화 될 때마다 새로운 값이 할당되며 서로 다른 객체 간에는 값을 공유할 수 없는 변수
⇒ 객체 단위로 값이 따로 관리되는 변수는 반드시 인스턴스 변수 사용
27. BookReader 클래스 정의
class BookReader:
country = 'South Korea' # 클래스 변수 country 선언
def __init__(self, name): # 초기화 함수 재정의
self.name = name # 인스턴스 변수 name 선언
def read_book(self):
print(self.name, 'is reading in', self.country)
28. >>> chris = BookReader('Chris Cho')
>>> anna = BookReader('Anna Cho')
>>> chris.read_book()
Chris Cho is reading in South Korea
>>> anna.read_book()
Anna Cho is reading in South Korea
한번 더 맞춰 보세요!!
>>> chris.country = 'U.S.A'
>>> chris.read_book()
Chris Cho is reading in U.S.A
>>> anna.read_book()
Anna Cho is reading in South Korea???
클래스 변수
값 변경
29. >>> chris = BookReader('Chris Cho')
>>> anna = BookReader('Anna Cho')
>>> chris.read_book()
Chris Cho is reading in South Korea
>>> anna.read_book()
Anna Cho is reading in South Korea
한번 더 맞춰 보세요!!
>>> chris.country = 'U.S.A'
>>> chris.read_book()
Chris Cho is reading in U.S.A
>>> anna.read_book()
Anna Cho is reading in South Korea
30. >>> chris = BookReader('Chris Cho')
>>> anna = BookReader('Anna Cho')
>>> chris.read_book()
Chris Cho is reading in South Korea
>>> anna.read_book()
Anna Cho is reading in South Korea
한번 더 맞춰 보세요!!
>>> chris.country = 'U.S.A'
>>> chris.read_book()
Chris Cho is reading in U.S.A
>>> anna.read_book()
Anna Cho is reading in South Korea
Immutable 객체의 값을 변경하니,
객체가 바뀌어 버린 경우
32. >>> BookReader.country = 'Italy'
>>> chris.read_book()
Chris Cho is reading in U.S.A
>>> anna.read_book()
Anna Cho is reading in Italy
>>> sean = BookReader('Sean Cho')
>>> sean.read_book()
Sean Cho is reading in Italy
한번 더 맞춰 보세요!!
>>> chris.country = 'U.S.A'
>>> chris.read_book()
Chris Cho is reading in U.S.A
>>> anna.read_book()
Anna Cho is reading in South Korea
???
???
???
올바른 클래스 변수 접근 방법
33. >>> BookReader.country = 'Italy'
>>> chris.read_book()
Chris Cho is reading in U.S.A
>>> anna.read_book()
Anna Cho is reading in Italy
>>> sean = BookReader('Sean Cho')
>>> sean.read_book()
Sean Cho is reading in Italy
한번 더 맞춰 보세요!!
>>> chris.country = 'U.S.A'
>>> chris.read_book()
Chris Cho is reading in U.S.A
>>> anna.read_book()
Anna Cho is reading in South Korea
34. >>> BookReader.country = 'Italy'
>>> chris.read_book()
Chris Cho is reading in U.S.A
>>> anna.read_book()
Anna Cho is reading in Italy
>>> sean = BookReader('Sean Cho')
>>> sean.read_book()
Sean Cho is reading in Italy
한번 더 맞춰 보세요!!
>>> chris.country = 'U.S.A'
>>> chris.read_book()
Chris Cho is reading in U.S.A
>>> anna.read_book()
Anna Cho is reading in South Korea
Immutable 클래스 변수 값을
변경하여 객체가 교체되면,
변경 전에 생성된 객체의
클래스 변수는 낙동강 오리알
신세가 됩니다.
35. SKBookReader 클래스 제대로 정의
class SKBookReader:
_COUNTRY = 'South Korea'
def __init__(self, name):
self.name = name
def read_book(self):
print(self.name, 'is reading in', SKBookReader._COUNTRY)
1) 내부용 변수 이름은 언더스코어
(_)로 시작
2) 상수는 대문자로 표기
3) 클래스 변수 접근은 객체(self)가
아닌, 클래스 이름으로
36. 이번에는?
>>> insuk = SKBookReader('조인석')
>>> insuk.name
'조인석'
>>> insuk.read_book()
조인석 is reading in South Korea
>>> insuk._COUNTRY
'South Korea'
>>> insuk._COUNTRY = 'U.K'
>>> insuk.read_book()
조인석 is reading in South Korea???
37. 이번에는?
>>> insuk = SKBookReader('조인석')
>>> insuk.name
'조인석'
>>> insuk.read_book()
조인석 is reading in South Korea
>>> insuk._COUNTRY
'South Korea'
>>> insuk._COUNTRY = 'U.K'
>>> insuk.read_book()
조인석 is reading in South Korea
38. 다시 정리해 볼까요?
‘클래스 변수’ :
클래스에 의해 생성된 모든 객체가 인스턴스화되는 시점에 같은 값을 조회할 때 사용
‘인스턴스 변수’ :
인스턴스화 될 때마다 새로운 값이 할당되며 서로 다른 객체 간에는 값을 공유할 수 없는 변수
⇒ 객체 단위로 값이 따로 관리 되는 변수는 반드시 인스턴스 변수 사용
⇒ 클래스 변수는 객체 이름이 아닌 클래스 이름으로 접근, 되도록 값이 변경되지 않는
경우에 사용하는 것이 안전하다!
40. 어떤 결과가 나오나요?
After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam
https://docs.python.org/3.7/tutorial/classes.html#scopes-and-namespaces-example
???
???
???
???
41. 어떤 결과가 나오나요?
After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam
???
???
???
https://docs.python.org/3.7/tutorial/classes.html#scopes-and-namespaces-example
42. 어떤 결과가 나오나요?
After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam
???
???
https://docs.python.org/3.7/tutorial/classes.html#scopes-and-namespaces-example
43. 어떤 결과가 나오나요?
After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam
???
https://docs.python.org/3.7/tutorial/classes.html#scopes-and-namespaces-example
44. 어떤 결과가 나오나요?
After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam
https://docs.python.org/3.7/tutorial/classes.html#scopes-and-namespaces-example
45. 어떤 결과가 나오나요?
After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam
https://docs.python.org/3.7/tutorial/classes.html#scopes-and-namespaces-example
46. 어떤 결과가 나오나요?
After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam
⇐ 좋은 코드인가요?
https://docs.python.org/3.7/tutorial/classes.html#scopes-and-namespaces-example
49. 구글 파이썬 코드 스타일 가이드
https://google.github.io/styleguide/pyguide.html
50. 구글 파이썬 코드 스타일 가이드
https://google.github.io/styleguide/pyguide.html
51. 구글 파이썬 코드 스타일 가이드
https://google.github.io/styleguide/pyguide.html
52. 기억하세요!!
● 파이썬 변수에 대입되는 객체는 데이터 타입에 따라 변할 수 있거나mutable
변할 수
없는immutable
성질을 갖는다.
● 위 성질에 따라 객체 변경시 서로 다르게 동작하니, 주의하여 사용해야 한다.
● 클래스/인스턴스 변수, 글로벌/로컬 변수는 서로 다른 유효 범위scope
를 갖는다. 단,
mutable 여부에 따라 예상치 못하게 변경될 수 있다.
● 어떤 변수를 써야 할 지 애매하다면, 유효 범위가 좁은 변수(인스턴스, 로컬)를 사용하는
것이 안전하다.
● 변수를 내부용으로 강제하고 싶다면, 변수 이름을 언더스코어(_)로 시작하자.
● 글로벌 변수 사용은 가능한 피하자.
● 파이썬 코딩 스타일 가이드(PEP 8)를 꼭 따르자.