2013-07-11 3 views
3

정확히 같은 이름의 전역 변수에 함수 인수를 어떻게 할당 할 수 있습니까?같은 이름을 가진 전역 변수에 인수 지정

참고 : 내 함수는 클래스의 내부 아니기 때문에 내가 self.myVariable = myVariable 할 수 없습니다 .

다음 코드를 작성하면 "인수가 로컬 및 글로벌입니다."라는 오류 메시지가 나타납니다.

myVar = 1 
def myFunction(myVar): 
    global myVar 

이것은 불가능합니까? 그렇다면 다른 언어로는 흔하지 않은가? java에서 오는 나는 this.myVar = myVar

편집 이름 : 나는 이미 변수의 이름을 바꿀 수 있다는 것을 알고있다. 그게 쉬운 길이야.

답변

4

최상의 솔루션 : 리팩토링 코드. 무언가의 이름을 바꾸거나 전역 변수 대신 객체 속성을 가진 객체를 사용하십시오.

얼터너티브, 해키 해결 방법 : 직접 전역 변수 DICT 수정 :

my_var = 1 
def my_function(my_var): 
    globals()['my_var'] = my_var 
+0

hacky, 내가 좋아하는 것 – Stephan

+0

Addendum : Do not do this! – user2357112

+0

너무 늦었습니다! 이것은 잘 작동하고 생각보다 덜 해킹됩니다. – Stephan

1

밖으로 쉬운 방법을 가지고 변수 (들)의 이름을 변경하는 것입니다 할 수있는 가장 좋은 (빠른) 일. 당신이 주장하는 경우에, 당신이 함께 이름 충돌 해결하기 수 :

import sys 
_global = sys.modules[__name__] 
# or _globals = sys.modules[__name__].__dict__ 

myVar = 1 
def myFunction(myVar): 
    _global.myVar = myVar # or _globals['myVar'] = myVar 

print myVar # 1 
myFunction(42) 
print myVar # 42 

설명 : 모듈 내에서

은 (문자열로) 모듈의 이름은 세계의 값으로 사용할 수 변수 __name__ 이름 sys.modules은 모듈 이름을 이미로드 된 모듈에 매핑하는 사전을 나타냅니다. myFunction()이 실행 중이면 해당 모듈이로드되었으므로 그 때 sys.modules[__name__]이 정의 된 모듈입니다. 전역 변수 MyVar 또한 모듈에 정의되어 있으므로 sys.modules[__name__].myVar을 사용하여 액세스 할 수 있습니다. (자바에의 사용이 비슷한 만들려면 당신은 그것을 this 이름을 수 -.하지만 개인적으로 _global 더 좋은 생각) 또한

, 이후 모듈의 읽기 전용 __dict__ 속성은 네임 스페이스이다 - 글로벌 네임 스페이스 일명 - 사전 객체로 표현하면 sys.modules[__name__].__dict__이이를 참조하는 또 다른 유효한 방법입니다.

두 경우 모두 global 키워드와 마찬가지로 존재하지 않는 이름에 대한 할당이 만들어지면 새로운 전역 변수가 만들어집니다.

+0

당신은'sys.modules [__ name __]'을 설명 할 수 있습니까? – Stephan

1

대답은 파이썬이 그것을하도록 속이는 것입니다. 귀하의 코드에서 :

myVar = 1 
def myFunction(myVar): 
    global myVar 

myFunction은 실행되지 않습니다. 결코 호출하지 않습니다. 따라서 스크립트는 global myVar 지점에 도달하지 않습니다. 그러나 파이썬은 여전히 ​​어떤 이유로 불어납니다. 나는 그것이 그것이 "이것을 허락하지 말라"고 말해 졌기 때문이라고 믿습니다. 어쨌든, 당신은 당신이 원하는 것을하기 위해 그것을 속일 수 있습니다.

myVar = 1 
def myFunction(myVar): 
    def trick(arg): 
     global myVar 
     myVar = arg 
    trick(myVar) 

print myVar # Comes back with 1 
myFunction(22) 
print myVar # Comes back with 22 

한 줄에되지 않을 수도 있습니다,하지만 당신은 아무것도 가져올 필요가 없습니다 쉽게 읽을 수 있습니다 : 제시되지 않은 한 가지 방법은 myFunction이의 간단한 기능을 사용하는 것입니다.

+0

아직 깨끗한 솔루션 thats 그리고 내가 좋아하는 20 + 인수로 멋지게 작동합니다, globals() 이상이 사용하는 이유는? – Stephan

+0

@Stephan : 글쎄, 나는 어떤 _technical_ 이유를 볼 수 없습니다. 그들은 같은 일을 마음으로합니다. 그러나 읽거나 유지하기가 쉽지 않습니다. 또한, 파이썬이 어떻게 글로벌 키워드를 제공 하는가에 따라, 내장 된 전역 변수 (재 정의 가능)보다는 파이썬 (적어도 저에게)이 사용하는 것이 더 좋습니다. – iCodez

관련 문제