2015-01-22 2 views
0

python3에서 키 값 쌍의 지속적인 집합을 저장하기 위해 전역 사전을 만들려고합니다. 어떤 이유로 나는 말한다 :이 나에게 오류를주고 내가 왜 이해가 안python3에서 글로벌 dict 사용 시도

#!/usr/bin/env python3 

from sys  import stdin 
from math  import sqrt 

d = {} 
def dict_check(num) : 
    print (num) 
    if len(num) != 2: 
     num1 = num2 = num[0] 
    else : 
     num1,num2 = num 
     print(num1,num2) 
    primes = [] 
    if num1 > num2 : 
     num1, num2 = num2, num1 
    if not num2 in d: 
     while num2 >= 1 : 
      if num2 in d: 
       primes += d[num2] 
       break  
      else : 
       if is_prime(num2) : 
        primes += [num2] 
       num2 -= 1 
     d += {num2:primes} 
    newList = [] 
    print(d) 
    for l in d[num2] : 
     if l < num1 : 
      break 
     newList += [l] 
    return sorted(newList)  



def is_prime (n) : 
    assert n > 0 
    if n == 1 : 
     return False 
    if n == 2 : 
     return True 
    if (n % 2) == 0 : 
     return False 
    for i in range(3, int(sqrt(n)) + 1, 2) : 
     if (n % i) == 0 : 
      return False 
    return True 

if __name__ == "__main__" : 

    inPut = ([int(v) for v in s.split()] for s in stdin) 
    m = [dict_check(i) for i in inPut] 
    for v in zip(*m) : 
     v = v 
     print(v[0]) 

:

1 10 
[1, 10] 
1 10 
Traceback (most recent call last): 
    File "prime1.py", line 51, in <module> 
    m = [dict_check(i) for i in inPut] 
    File "prime1.py", line 51, in <listcomp> 
    m = [dict_check(i) for i in inPut] 
    File "prime1.py", line 17, in dict_check 
    if not num2 in d: 
UnboundLocalError: local variable 'd' referenced before assignment 

가 여기 내 코드입니다. 나는 그것을 def 밖에서 선언 했으므로 전역 적이어야한다. 나는이 일을 전에했는데 일하는 것 같지 않습니다.

+0

글로벌 * 읽기 *는 의도 한대로 작동합니다. Global * writing *에는'global' 키워드가 필요합니다. 이것은 여기에 답변 : http://stackoverflow.com/a/423596/145400 –

+0

[가능한 그들을 생성 한 이외의 함수에서 전역 변수를 사용하여] 중복 (http://stackoverflow.com/questions/423379/) 사용하는 것 이외의 함수에서 전역 변수 사용하기 –

+0

'+'를 사용하여 dict에 항목을 추가 할 수 있다고 생각하지 않습니다. 'd [num2] = primes'을하려고하십니까? – Kevin

답변

0

d += {num2:primes}은 파이썬에 모호합니다. d는 왼쪽에 로컬이고 오른쪽에 글로벌입니다. 함수의 맨 위에 global d을 넣어 문제를 해결할 수 있습니다.

def dict_check(num) : 
    global d 
    ... 
+0

좋은 시작이지만 다음 OP는 TypeError : + = : 'dict'및 'dict'에 대해 지원되지 않는 피연산자 유형을 얻습니다. – Kevin

+0

내가 돌아 왔음에도 불구하고 d를 유지하려고하므로 사실이 작동하지 않습니다. 작동하지 않습니다. – Sabersimon

+0

@Kevin - 네,하지만 그 다음 질문입니다. 'd.update ({num2 : 소수})'또는 더 위선적 인'd [num2] = primes'는 그것을 할 것입니다 ... 그리고 OP는이를 위해 전 세계를 필요로하지 않을 것입니다. 하지만 원래 오류는 설명하지 않습니다. – tdelaney