2010-07-23 11 views
0

함수는 범위 밖의 변수를 참조 할 수 있지만 설정할 수는 없습니다. 이 올바른지? 나는이 권리를 이해하고 있는가?간단한 파이썬 변수 범위

나는 또한 전역 사용을 포함했습니다. 나는 그들이 나쁜 주주이며 그들을 피할 것이라는 것을 안다. 이 문제를 해결하는 방법을 알고 있지만, 그냥 명확히하고 싶었습니다.

내 예제 프로그램 :

import foo 

# beginning of functions 

# this one works because I look at the variable but dont modify it 
def do_something_working: 

    if flag_to_do_something: 
      print "I did it" 

# this one does not work because I modify the var 
def do_something_not_working: 

    if flag_to_do_something: 
      print "I did it" 
      flag_to_do_something = 0 

# this one works, but if I do this God kills a kitten 
def do_something_using_globals_working_bad_ju_ju: 

    global flag_to_do_something 

    if flag_to_do_something: 
     print "I did it" 
     flag_to_do_something = 0 


# end of functions 

flag_to_do_something = 1 

do_something_working() 
do_something_not_working() 
do_something_using_globals_working_bad_ju_ju() 

답변

5

수정. 대체로. flag_to_do_something = 0 변수를 수정하지 않으면 새 변수를 만듭니다. 이 함수에서 만든 flag_to_do_something은 (이 경우) 동일한 개체에 대한 별도 링크입니다. 그러나 변수를 수정 한 함수 나 연산자를 사용했다면 코드가 작동했을 것입니다.

예 :

g = [1,2,3] 
def a(): 
    g = [1,2] 
a() 
print g #outputs [1,2,3] 

g = [1,2,3] 
def b(): 
    g.remove(3) 
b() 
print g #outputs [1,2] 
+0

내가 볼 아. 그래서 비 목록 변수를 제거하는 것과 같은 것이 있습니까? flag_to_do_something.set (0) 처럼요? –

+1

아니요, * 변수 * (이름 일뿐입니다), * 객체 * 만 변경할 수는 없습니다. 그리고 int 같은 불변 객체는 변이 될 수 없습니다. 그러나 함수 내에서'global' 선언을 사용하여 전역 변수에 할당 할 수 있습니다 :'global flag_to_do_something; flag_to_do_something = 0'. –

0

네, 꽤 많이. 파이썬의 "글로벌"변수는 실제로 모듈 수준의 변수입니다. 전역 변수는 전역 변수와 마찬가지로 전체 프로그램이 아닌 파이썬 모듈 (원시 파일)입니다. 따라서 파이썬 전역은 C와 같이 전역 변수만큼 나쁘지는 않습니다.하지만 여전히 피할 수 있습니다.