
global()를 사용하면 전역 변수 네임 스페이스와 연결된 dict가 return된다.
전역 스코프에서 사용된 locals()도 globals()와 동일하다.
따라서, print(x), print(y) 모두 잘 실행되는 것을 알 수 있다.
그러나, 아래와 같이 함수가 씌워져 있으면 얘기는 달라진다.

다음의 코드를 실행하면, print(x)에서 NameError가 발생한다.
이유는 다음과 같다.
globals()는 전역 변수 네임 스페이스에 직접 접근이 가능한 dict가 return되고, 이를 변경하면 실제 네임 스페이스가 변경된다.
locals()는 지역 변수 네임 스페이스에 직접 접근 가능한 dict가 아니고, 복사본이 return 되는 듯 하다. 따라서, dict를 변경한다고 지역 변수 네임 스페이스가 변경되는 것은 아니기 때문에 x 라는 변수명을 사용할 때, 정의되지 않았다고 에러가 발생한다.
(locals()를 전역 스코프에서 사용하면, 전역 변수 네임 스페이스에 직접 접근할 수 있었던 것을 생각해보면, 그 땐 globals()가 실행되게 짜놨거나, 아니면 지역 변수 네임 스페이스에는 접근할 수 없는 하나의 장치가 더 있는 듯 하다.)
https://github.com/python/cpython/blob/main/Python/ceval.c
에서 구현을 확인해보자
cpython/Python/bltinmodule.c


각 함수가 구현됨을 알 수 있다.
cpython/Python/ceval.c


여기서 local 프록시임을 확인해서 프록시라면(지역 스코프에서 실행), 새로운 dict ret를 만들어서 그 곳에 locals의 내용을 복사해서 ret을 return하는 것 같다.
cpython/Objects/frameobject.c

전역 스코프에서 f_locals는 f_globals와 네임 스페이스를 공유한다고 한다.
그런데 이 부분에선 확인할 수 없고, 어디에 있는지 더 찾아봐야겠다.