변수의 Scope 이해_실습

파이썬 데이터분석 입문 강좌의 맛보기 강의입니다.

강의 대본 보기

지역변수와 전역변수에 관한 실습을 한번 해보도록 할게요. 함수를 일단 선언을 두 가지를 해보죠. 함수선언 부분이고요. define, def로 function1을 일단 만들게요. function1을 만들고 function1은 이렇게 지역변수를 줬어요. 이건 지역변수죠. 지역변수. 왜냐하면 함수 안에, function1이라는 거 안에 만들었기 때문에 지역변수가 되는 거고요. 그래서 프린트해서 여기다가 저희가 a를 출력해 보도록 하겠습니다. 그리고 또 하나 뭐를 만들 거냐면 펑션을 저희가 둘을 만들 거고요. 지금 두 개 만든 펑션은 입력 매개변수는 없어요. 그거를 만들 건 아니니까 저희가 그래서 a를 출력을 한번 해보죠. 그리고 나서 전역변수를 하나 줘 볼게요. 똑같은 이름으로 바꿨다가 그래서 여기는 메인 코드 부분에 해당되는 부분이죠. 메인 코드에 해당되는 부분이고요. 메인코드에도 똑같이 a를 20을 해줘. 얘는 바깥에서 선언했기 때문에 얘는 전역변수, 글로벌 베리어블이 되는 거죠. 두 개의 차이가 좀 있고요. 함수 안에서 선언한 건 지역변수라 그러고, 그 다음에 바깥에서 선언한 건 저희가 전역변수라고 얘기를 합니다. 그래서 우리가 한번 코드를 찍어보죠. 그래서 function1을 한번 프린트를 해볼까요? function1을 콜해서 function1을 여기서 콜을 하면 이름을 function1이라 그러고요. 펑션2도 콜을 해볼게요. 펑션1은 호출을 했으니까 쫓아가보면 펑션1으로 갈 거고요. a에 10이 나왔어요. 여기서 프린트를 했겠죠. 그러면 화면에 뭐가 나올까요? 10이 나오겠죠. 다시 말하면 펑션1에서의 코드이기 때문에 이렇게 한번 해볼까요? 그래서 펑션1의 코드가 나오는 거고요. 그래서 여기다가 조금 더 자세하게 이렇게 쓰면 좀 헷갈릴 것 같으니까 어디서 선언했는지 또 불렀는지에 대해서 한번 해볼게요. 그래서 function1에서 a의 값 이렇게 한번 해볼까요? 조금 더 선명하게 그냥 찍는 것보다 이게 더 나을 것 같습니다. a의 값 하고요.%d 주시고 그리고 우리가 포맷을 줘야 되니까% 하고요. a 이렇게 찍어 보겠습니다. 밑에 것도 저희가 function2에서도 어떤 값이 찍히는지 한번 확인해 보고 갈게요. 그래서 function2에서 a 값을 이렇게 펑션1으로 가시면 펑션1에서 a값은 여기 지역변수를 두 가지 똑같은 이름으로 선언되면 지역변수가 우선이라고 했기 때문에 아마 10이 찍힐 것 같고요. 펑션2는 본인이 가지고 있는 게 없기 때문에 전역변수를 써야 되니까 20이 찍히겠죠. 저희 예상은 뭐냐면 10하고 20이 찍히는 거죠. 예상을 하고 먼저 보시면 10하고 20이 정확히 찍혔네요. 그래서 저희가 이런 테스트로 해본 결과는 똑같은 이름이라면 지역변수가 전역변수보다는 우선이다 라는 것을 보게 된 거죠. 이번에는 function1, function2를 줬는데 저희가 전역변수를 선언하지 않았어요. 그리고 나서 function1에 b의 값을 지역변수를 하나 만들어 놨고요. 그 다음 function2는 b의 값을 선언되지도 않았고 전역변수도 b의 값이 없어요. 그러면 function1을 저희가 콜했을 때 한번 쫓아가 보면 b에는 10이 들어가 있고 10의 값이 여기 찍히겠죠. 그런데 function2는 자기한테도 없고 전역변수도 b가 없어요. 그러면 없기 때문에 몰라 라고 에러가 날 수 있어요. 그래서 실행을 해볼게요. 이렇게 실행해 보시면 function1에서는 10이 제대로 찍혔는데 function2의 name이라죠. b라는 것은 not defined, 선언되지 않았다고 된 거죠. 전역변수도 없고 지역변수도 없으니까 당연히 에러가 날 수 있는 부분이죠. 그런 부분이라고 생각을 하시면 되겠습니다. 글로벌 예약어를 쓰실 때는 어떤 경우에 쓰시냐면 아까 그 a 20 있던 거 있죠? 전역변수가 a 20으로 살아있고요. 그 다음에 펑션1에서도 a 10을 우리가 얘기했던 이 a 10을 저희가 지역변수로도 쓰고 있는 것 같죠? 근데 이 a 10을, a를 10을 가져가는 이 a가 똑같은 a이긴 하지만 펑션1 안에 있지만 이걸 이번에는 저희가 여기 있는 20을 가져다 쓰고 싶은 거예요. 전역변수를 지역변수로 쓰지 않고 똑같은 이름이지만 지역변수로 쓰지 않고 전역변수로 같이 이 주소로 가지고 그대로 쓰고 싶다. 그럴 때는 글로벌이라는 키워드를 주시면 돼요. 그래서 a라는 밑에서 쓰는 이 똑같은 이름이 지역변수가 아니고 전역변수 걸 갖다 써라 그랬으니까 결국은 여기가 20이 되는 거죠. 그래서 20인데 a를 똑같은 주소로 공유하다 보니까 20을 10으로 바꿀 거예요. 그래서 여기서 보면 10으로 바뀐 뭐가 찍힐까요? 여기 a가 10으로 바뀌어서 10이 찍히는 거고요. function2에서는 20을 가져다 쓰려고 했는데 이미 펑션1이 먼저 콜됐잖아요. 먼저 콜됐기 때문에 이걸 받아다가 10으로 바꾼 10이 출력이 되는 거죠. 그래서 한번 출력을 해보도록 하겠습니다. 그러면 a값도 10이고 밑에 있는 펑션2의 a값도 10이에요. 펑션1이 가져다가 바꿨기 때문에 그런 거죠. 그러면 이거를 순서를 좀 콜하는 순서를 좀 바꿔볼까요? 펑션2를 먼저 콜할게요. 순서는 언제든지 저희가 원하는 순서대로 콜할 수 있으니까요. 그래서 펑션2를 먼저 콜한 다음에 a에 20을 먼저 찍겠죠. 그리고 얘는 function1에서 20을 가져다가 똑같은 주소로 공유했기 때문에 10으로 바꿨으니까 그제서야 우리가 20, 10 이렇게 찍히겠죠. 그래서 글로벌이라는 키워드는 똑같은 이름의 지역변수가 있다면 지금 그 변수를 쓰지 않고 전역변수의 이름을 갖다 쓸래요 라고 하실 때 앞에다 키워드 글로벌을 써주시면 그 부분이 가능하더라 라는 것도 설명해 드렸습니다.

이 강좌의 맛보기 강의

파이썬 데이터분석 입문
파이썬 데이터분석 입문강좌 자세히 보기