python 좀 헷갈리는 부분들
파이썬 혹은 야매썬
잘 만들어서 대충 써도 돌아가지만 그렇다고 계속 야매로 쓰다보면 얼척없이 돌아가는 야매야매야매썬 정리해보자
제약
이 글은 python3 기준의 이야기이다
scope : local, global ... nonlocal ?!
local
local은 로컬이다. 팡샨 안에서 선언하면 글로벌과 같지 아니하다. 그리고 콜바이 밸류다. 글로벌 밸류를 파라미터로 던져서 바꾸려고 해도 로컬 변수만 변한다.
사실 임마때문에 이 글을 쓰게 되었다. python은 선언이 없다. 당연히 글로벌 스코프의 x를 땡겨와서 300으로 설정할 것 같은데 myfunc()내부에서 x = 300을 쓰는 순간 로컬 x를 별도 선언하고 x를 쓴다. 글로벌은 바로 접근이 안된다. ㅎ... 기초 문법도 모르고 개발을 하니까 개고생을...
x = 0def myfunc():x = 300print(x)myfunc()print(x)-------결과3000
자바스크립트처럼 쓰면 될 것 같은데 호이스팅이 없다. 로컬 변수를 스코프 밖에서 사용하면 에러가 난다.
x = 0def calllocal():x = 3y = 3print(x)print(y)def calllocal2(x):x=400print(x)calllocal()calllocal2(x)print(y)-------결과Traceback (most recent call last):File "./prog.py", line 16, in <module>NameError: name 'y' is not defined
긍데 펑션안펑션에서 밖의 펑션의 값은 가져올 수 있다.
def myfunc():x = 300def myinnerfunc():print(x) # myfunc의 x를 가져온다.myinnerfunc()myfunc()-------결과300
global
임마때문에 이 글을 쓰게 되었다2. 글로벌 변수를 땡겨 쓸 수는 있지만 할당(assignment)하는 순간 로컬 변수로 별도 선언된다. 글로벌 변수는 지 혼자 논다.
x = 5def globalX():global xx = 10print(x)print(x)globalX()print(x)-------결과51010
글로벌, 로컬을 와리가리하려고 이렇게 이상하게 쓰면 터진다.
x = 5def globalX():print(x) # 여기서 글로벌 x를 가져올 것 같지만 아래 할당(선언)된 x가 있으므로 로컬이다. 근데 할당되지 않은 로컬 변수를 참조하므로 에러 터짐.x = 10print(x)print(x)globalX()print(x)-------결과Traceback (most recent call last):File "./prog.py", line 9, in <module>File "./prog.py", line 4, in globalXUnboundLocalError: local variable 'x' referenced before assignment
nonlocal
로컬, 글로벌이야 그렇다쳐도 nonlocal은 혼내주고 싶음. 선넘는 이름이다. 로컬이 아니라는 의미다. 로컬과, 논로컬과 글로벌을 한대 뭉쳐보면 다음과 같다.
x = "Jack"def myfunc1():x = "Jane"def myfunc2():nonlocal xx = "hello Jane"myfunc2()return xdef myfunc3():x = "Jane2"def myfunc4():global xx = "hello Jane2"myfunc4()return xprint(x)print(myfunc1())print(myfunc3())print(x)-------결과hello
self
스콥 이야기는 아니지만...
https://velog.io/@magnoliarfsit/RePython-1.-self-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0
단항연산자
++가 없다. --도 없다. 완전 매니안데... 섭섭. integer가 immutable이므로 증가하여 재할당이 불가능하다. 사실 ++도 --도 쓰면 안된다고 생각하면 쓰면 안될 녀석들이다.
https://stackoverflow.com/questions/3654830/why-are-there-no-and-operators-in-python https://stackoverflow.com/questions/1485841/behaviour-of-increment-and-decrement-operators-in-python