2013-10-10 2 views
1

"글로벌"문에 대한 필요 : 위해, 모든 시간을 할당 할 그냥 수정하지에,글로벌 배열 -이 코드를 썼다

sample_array = ones ([N, 3], dtype = float) 
def get_training_set(): 
    r = rand (N, 2) * 2 - 1 
    sample_array[:,[0,1]] = r 
    return sample_array 

내가 외부 샘플링 배열 선언을 - 마지막 좌표는 항상 1입니다.

처음에는 함수에서 "global sample_array"문을 삽입해야합니다. 왜냐하면 수정하기 때문에 평가자는 전역 var이라는 것을 알아야합니다.

그러나 놀랍게도 "글로벌"없이는 잘 작동합니다. 왜 작동합니까? /이 경우 평가의 정의는 어디에 있습니까?

답변

1

global은 객체에 대한 참조를 변경하는 경우 (예 : 과제가있는 경우) 필요합니다. 객체를 변형하는 경우 (예 : 위에서 수행 한 것과 같은 슬라이스 할당과 같이) 이 아닌이 필요합니다.

정확한 설명서는 here입니다.

전역 명령문은 현재 코드 블록 전체에 적용되는 선언입니다. 나열된 식별자가 전역 변수로 해석되어야 함을 의미합니다.

글로벌 문장을 사용하면 파이썬에 변수가 글로벌 컨텍스트에 있다는 것을 알게됩니다. 할당하면 전역 컨텍스트의 값이 변경됩니다.

global 문을 사용하지 않으면 python은 변수가 로컬인지 로컬인지를 결정합니다. (실제로 python3.x는 nonlocal 키워드를 추가했습니다. 변수가 할당의 오른쪽에 처음 나타나거나 항목 할당 (x[...] = ...) 또는 속성 할당 (x.whatever = ...)을 수행하는 경우 변수는 로컬이 아닙니다. 변수가 지역 변수이면 함수에서 작성된 것입니다 (또는 입력 인수 임). 로컬 식별자에 직접 재 할당 할 수 있으며 아무런 문제가 없습니다. 변수가 로컬이 아닌 경우 변수를 변경할 수는 있지만 파이썬은 변수가 로컬인지 아닌지를 결정할 수 없기 때문에 변수를 다시 할당 할 수 없습니다.

+0

좋음. 이것을 설명하는 공식 매뉴얼/정의를 보여줄 수 있습니까? – alinsoar

+0

@alinsoar 돌연변이는 여러분이하고있는 바로 그 자리에서 무엇인가를 바꿀 때입니다. ** 함수에서 ** 무언가를 정의하고 반환하지 않았으며 그 함수를 참조하고 있다면 ** 전역 ** 문이 필요합니다. –

+0

@ mgilson. 나는 세계를 의미하는 것이 무엇인지 압니다. 그러나, 나는 가변 변수에 어떤 일이 일어나는지 직접적인 정의는 없다. – alinsoar

0

필자는 sample_array가 함수 내부에서 선언되지 않았기 때문에 생각합니다. Python은 side_namespace에서 sample_array를 찾을 수 없으며 외부 네임 스페이스를 찾습니다. 예.

a = [] 

def test1(): 
    a.append(1) # will use the outer one 

def test2(): 
    a = [] 
    a.append(1) # will use the inner one 

글로벌, 때로는위한 전역 변수 선언

def declare_global(): 
    global b # this should be global after 'declare_global()' is called 
    b = 1 

print b # raise NameError: name 'b' is not defined 
declare_global() 
print b # will output '1' 
+0

내 문제는 약간 다르다고 생각합니다;) 그것은 변하기 쉬운 변수에 관한 것이고, 그것은 보통 var와 다르게 취급됩니다. – alinsoar

+0

죄송합니다. _ < – MorningBAI

+0

은'a.append (1)'이어야합니다 - 괄호가 아닌'[] ' – mgilson