我收到以下错误:
Warning (from warnings module):
File "C:\Python34\projectEuler\projectEuler.py", line 316
global primeSet, primeList, primeCap, primeRan
SyntaxWarning: name 'primeRan' is used prior to global declaration
代码:
primeSet = {2, 3}
primeList = [2, 3]
primeCap = 3
primeRan = False
def primeGen():
if primeRan:
primeList, primeCap = primeList, PrimeCap
global primeSet
else:
global primeSet, primeList, primeCap, primeRan
primeRan = True
for i in primeList:
yield i
while(True):
primeCap += 2
m = int(primeCap**.5)
yesPrime = True
for p in primeList:
if p > m: break
if primeCap%p == 0:
yesPrime = False
break
if yesPrime:
primeSet.add(primeCap)
primeList.append(primeCap)
yield primeCap
在分配变量之前不会写入变量。代码似乎有效。 语法消息是错误警报,还是应该在读取之前声明全局? (而不是仅在写作之前声明)
代码:
def primeGen():
global primeRan
if primeRan:
primeList, primeMax = primeList, PrimeCap
global primeSet
else:
global primeSet, primeList, primeCap
primeRan = True
摆脱SyntaxWarning
。但是,对于只读取而不是写入的值,全局减速似乎是错误的。
我应该忽略语法警报吗?
答案 0 :(得分:6)
不,你不能忽略它,从Python 3.6
开始will cease to be a SyntaxWarning
and instead be updated to an error (SyntaxError
)。因此,您现在可以更好地修复它,或者面对它未在未来版本中执行的前景(>= 3.6
)。
请参阅global
statement上的文档:
global
语句中列出的名称不得在文本上位于该全局语句之前的相同代码块中使用。
正如您所注意到的,这不是在运行时生成的警告,它是在Python编译您的函数对象时生成的,并且注意到包含名称的global
语句(primeRan
)已被发现为当地人。
您应该在引用global
此处之前添加primeRan
语句,并对primeList
执行相同的,这会成为同一问题的受害者。
对于primeList
,您可能会偷偷摸摸地利用global
必须首先解析的事实。简而言之,切换条件,以便Python在赋值语句之前解析它的global
语句:
def primeGen():
global primeRan
if not primeRan:
global primeSet, primeList, primeCap
primeRan = True
else:
primeList, primeMax = primeList, PrimeCap
# rest as is
由于global
是解析器的指令,因此会产生与警告相同的行为。
当然,使用globals
不是一个好习惯。我无法理解为什么你需要使用它们才是诚实的,你总是会更好(从概念上来看,执行速度明智)放弃使用{{ 1}}而是使用参数和返回值与您的函数进行通信。