본문 바로가기
  • Fearless
프로그래밍언어/python

[파이썬문법] 14. 전역/지역변수 & *args/**kwargs

by Albatross 2022. 4. 22.
반응형

1. local vs global variable

잘 살피면 calculate 함수를 실행했음에도 total이 0임을 확인할 수 있는데,

이는 해당 함수 내에서 total이 재정의 되었기 때문에 지역변수로 기능함에 기인한다.

 

1) 지역변수간의 바뀜

2) 함수 내에서 전역변수를 불러와서 바꿨음

3) 리스트 객체의 주소값을 전달해서 값을 변경했기 때문에 바뀜(c언어 포인터 느낌)

 

당연한 얘기

 

당연한 얘기2

 

이미 전역변수로 선언된 variable을 함수에서 수정할 수 없음. 충돌이 발생하기 때문.

그냥 들고와서 쓸수도 있고, 동일한 이름을 가진 지역변수를 생성할 수도 있지만 수정은 안된다.

 

이 경우 함수 내에서 조작하는 pi가 전역변수임을 선언해주면 된다.

global pi를 선언해주면 지금 내가 다루고 있는 pi가 전역변수라는 것을 알리는 것이고, 실제로 함수내에서의 수정이 전역변수값의 변화로 이어진다.

 

localS는 지역변수기 때문에 실행이 안된다.

내부의 전역변수와 외부의 전역변수가 이름은 같지만 서로 다른 객체다. 선언을 따로 해주었기 때문이다. 

 

그런데 global S를 global로 전역변수 선언해주고 다루면 해당 전역변수값을 변경해주는 것이 된다.

 

마찬가지로 global localS를 선언하면 함수 내에서 전역변수를 선언해주는것과 같다.

 

 

2. argume​nt types

1. positional arg: 정해진 위치에 무조건 입력되어야만 하는 인자.

2. default param: 특별한 입력이 없다면 이미 그 디폴트값이 정해진 인자. 무조건 positional 뒤에 위치해야함.

3. keyward arg: 1번과 비슷한데 함수사용시 postitional arg의 변수명까지 같이 적어주면 순서가 상관없음.

4. variable param: 정해지지 않은 수의 인자를 받게됨. 튜플의 형태로 들어온다.

5. undefined param: 정해지지 않은 인자를 받게됨. 사전형식으로 전달된다. 

 

locals()는 현재 지역변수의 key, value를 반환해준다.

이 경우 3,4,5,6,7이 radius로 튜플형태로 들어감을 확인할 수 있음.

return값은 areas에 append된 것이니 list다. 

 

1) pos arg, default arg

2) pos arg, defualt arg를 변형

3) default arg, keyword arg : pos를 변수이름까지 써서 지정해주면 keyword arg가 되고 이는 순서 상관없음. 대신 만약 pos arg가 있다면 무조건 pos arg 뒤에 선언되어야만 한다.

 

syntaxerror 그대로, pos arg가 keyword arg 뒤에 위치한다. 

 

아 안된다고요

 

3은 rad로 pos arg

3.14랑 3.1415는 pi로 튜플로 들어갔다. for loop으로 item 처리중

**kwargs는 항상 딕셔너리 형태기 때문에 input도 저렇게 key, value 동시에 해줘야한다. 

 

items() 하면 key, value로 각각 나오네요.

*(3,4,5), **(k1=1, k2=2)로 가독성 좋게 전달해도 된다. 

결정적으로 kwargs, args 쓰는게 여러 변수 처리하기 위함인데 안들어오는게 보통 디폴트.

 

이거 다소 헷갈릴수도 있는게 tuple을 *args로 넘겼는데 그럼 튜플 내부의 튜플의 내부의 원소에 대한 접근이 불가하다. 

반응형