python 좀 헷갈리는 부분들

파이썬 혹은 야매썬

잘 만들어서 대충 써도 돌아가지만 그렇다고 계속 야매로 쓰다보면 얼척없이 돌아가는 야매야매야매썬 정리해보자

제약

이 글은 python3 기준의 이야기이다

scope : local, global ... nonlocal ?!

local

local은 로컬이다. 팡샨 안에서 선언하면 글로벌과 같지 아니하다. 그리고 콜바이 밸류다. 글로벌 밸류를 파라미터로 던져서 바꾸려고 해도 로컬 변수만 변한다.

사실 임마때문에 이 글을 쓰게 되었다. python은 선언이 없다. 당연히 글로벌 스코프의 x를 땡겨와서 300으로 설정할 것 같은데 myfunc()내부에서 x = 300을 쓰는 순간 로컬 x를 별도 선언하고 x를 쓴다. 글로벌은 바로 접근이 안된다. ㅎ... 기초 문법도 모르고 개발을 하니까 개고생을...

x = 0
def myfunc():
x = 300
print(x)
myfunc()
print(x)
-------결과
300
0

자바스크립트처럼 쓰면 될 것 같은데 호이스팅이 없다. 로컬 변수를 스코프 밖에서 사용하면 에러가 난다.

x = 0
def calllocal():
x = 3
y = 3
print(x)
print(y)
def calllocal2(x):
x=400
print(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 = 300
def myinnerfunc():
print(x) # myfunc의 x를 가져온다.
myinnerfunc()
myfunc()
-------결과
300

global

임마때문에 이 글을 쓰게 되었다2. 글로벌 변수를 땡겨 쓸 수는 있지만 할당(assignment)하는 순간 로컬 변수로 별도 선언된다. 글로벌 변수는 지 혼자 논다.

x = 5
def globalX():
global x
x = 10
print(x)
print(x)
globalX()
print(x)
-------결과
5
10
10

글로벌, 로컬을 와리가리하려고 이렇게 이상하게 쓰면 터진다.

x = 5
def globalX():
print(x) # 여기서 글로벌 x를 가져올 것 같지만 아래 할당(선언)된 x가 있으므로 로컬이다. 근데 할당되지 않은 로컬 변수를 참조하므로 에러 터짐.
x = 10
print(x)
print(x)
globalX()
print(x)
-------결과
Traceback (most recent call last):
File "./prog.py", line 9, in <module>
File "./prog.py", line 4, in globalX
UnboundLocalError: local variable 'x' referenced before assignment

nonlocal

로컬, 글로벌이야 그렇다쳐도 nonlocal은 혼내주고 싶음. 선넘는 이름이다. 로컬이 아니라는 의미다. 로컬과, 논로컬과 글로벌을 한대 뭉쳐보면 다음과 같다.

x = "Jack"
def myfunc1():
x = "Jane"
def myfunc2():
nonlocal x
x = "hello Jane"
myfunc2()
return x
def myfunc3():
x = "Jane2"
def myfunc4():
global x
x = "hello Jane2"
myfunc4()
return x
print(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

참고

https://www.w3schools.com/python/python_scope.asp