2011-09-21 11 views
0

파이썬 스크립트를파이썬 변수 범위 문제

def show(name): 
    def getName(): 
        return _name 
    def setName(value): 
     _name = value 
    _name = '' 
    print('Input parameter: ', name) 
    print('Global variable: ', say_hello) 
    print('Change private variable: ', setName(name)) 
    print('Get private variable: ', getName()) 
    print('Private variable: ', _name) 
    print('Input parameter: ', name) 
say_hello = 'hello' 
show('Jim') 

출력 :

Input parameter: Jim 
Global variable: hello Change 
private variable: None 
Get private variable: 
Private variable: 
Input parameter: Jim 

왜 내부 기능 _name의 값을 변경하지 않는, 아직 기능 show이를 얻을 수 있습니다 say_hello 값? 변수 범위 문제라는 것을 알고 있지만 자세한 내용을 알고 싶습니다.

+0

내 파이썬 버전은 파이썬 3.2 (r32 : 88445, 2011 년 2 월 21 일, 11:29:37)입니다. – dghost

+0

제 질문에 대해 설명해 주셔서 감사합니다! 여러분 모두에게 감사드립니다! : ^) – dghost

답변

0

_name은이 경우 모든 변수 이름이 함수에 할당 될 때 setName() 함수의 지역 변수입니다.

global 진술이 없거나 3.x 인 경우 nonlocal 진술 -이 경우 도움이됩니다.

1

함수의 할당은 함수의 로컬 범위에 할당됩니다. setNamesetName에 로컬 범위의 _name을 할당하고, 외부의 _name은 영향을받지 않습니다.

Python 2.X에서는 global 문을 사용하여 모듈 전역 범위에 할당 할 수 있지만 외부 로컬 범위에는 할당 할 수 없습니다.

파이썬 3.X는 nonlocal 문을 추가합니다 (자세한 내용은 PEP-3104 참조). 귀하의 예제에서 nonlocal은 setName에서 외부 로컬 범위에 할당 할 수 있습니다.

This blog post은 Python의 변수 범위 지정에 대해 몇 가지 좋은 예와 해결 방법을 제시합니다 (특히 예제 5 참조).

+0

고마워요! 매우 도움이됩니다. : ^) – dghost

0

showsay_hello 방법으로 이동하지 않는 이유는 무엇입니까?

class SayHello(unicode): 
    _name = u"" 
    def get_name(self): 
     return self._name 

    def set_name(self, value): 
     self._name = value 

    def show(self, name): 
     self.name = name 
     print(self, self.name) 

    name = property(get_name, set_name) 

say_hello = SayHello('hello') 
say_hello.show('Jim') 

엄격하게 필요하지 않으면 전역 변수를 사용하지 마십시오.

+0

고마워요! 그것은 나에게 정말로 도움이된다! : ^) – dghost