尝试在python3中使用全局dict

尝试在python3中使用全局dict,python,dictionary,global-variables,primes,Python,Dictionary,Global Variables,Primes,我试图在python3中创建一个全局字典来存储一组正在进行的键值对。出于某种原因,我说: 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_che

我试图在python3中创建一个全局字典来存储一组正在进行的键值对。出于某种原因,我说:

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
110
[1, 10]
1 10
回溯(最近一次呼叫最后一次):
文件“prime1.py”,第51行,在
m=[输入中i的dict_check(i)]
文件“prime1.py”,第51行,在
m=[输入中i的dict_check(i)]
文件“prime1.py”,第17行,在dict_check中
如果d中没有num2:
UnboundLocalError:赋值前引用了局部变量“d”
这是我的密码:

#!/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])
#/usr/bin/env蟒蛇3
从sys导入stdin
从数学导入sqrt
d={}
def dict_检查(数字):
打印(个)
如果len(num)!=2:
num1=num2=num[0]
其他:
num1,num2=num
打印(num1,num2)
素数=[]
如果num1>num2:
num1,num2=num2,num1
如果d中没有num2:
当num2>=1时:
如果d中有num2:
素数+=d[num2]
打破
其他:
如果是_素数(num2):
素数+=[num2]
num2-=1
d+={num2:primes}
新列表=[]
印刷品(d)
对于d中的l[num2]:
如果l0
如果n==1:
返回错误
如果n==2:
返回真值
如果(n%2)==0:
返回错误
对于范围(3,int(sqrt(n))+1,2)内的i:
如果(n%i)==0:
返回错误
返回真值
如果名称=“\uuuuu main\uuuuuuuu”:
输入=([int(v)表示s中的v.split()]表示s表示stdin)
m=[输入中i的dict_check(i)]
对于拉链中的v(*m):
v=v
打印(v[0])

我不明白为什么这会给我错误。我已经在def之外声明了它,所以它应该是全局的。我以前做过这个,但它似乎不起作用。

d+={num2:primes}
对python来说是不明确的。d在左手边是局部的,在右手边是全局的。您可以通过将
global d
放在函数顶部来解决此问题

def dict_check(num) :
    global d
    ...

更改全局变量的值时,全局变量必须使用“Global”关键字

YourDict = {"Key1", "Value1"}

def Change():
    global YourDict
    YourDict.keys["Key1"] = "Value2"

全球阅读按照你的意愿运作。全局写入需要
Global
关键字。这里的答案是:我不认为您可以使用
+
将项目添加到dict中。您是否正在尝试执行
d[num2]=primes
?良好的开始,但下一个操作将获得
TypeError:不支持+=:“dict”和“dict”的操作数类型。
。这不起作用,因为即使返回,我仍希望d保持不变。它不起作用。@Kevin-是的,但这是下一个问题
d.update({num2:primes})
或者更合理地
d[num2]=primes
可以做到这一点。。。OP不需要一个全球性的。但这并不能解释最初的错误。@Sabersimon-当你说
global d
时,你是在告诉python使用peristent
d
,而不是在函数本地名称空间中创建一个临时的。