在全局声明之前使用的Python 3 SyntaxWarning变量

2024-10-01 13:34:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我得到以下错误:

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

对于代码:

^{pr2}$

变量在分配之前不会写入。代码似乎起作用了。 语法消息是错误警报,还是应该在读取前声明全局消息?(而不是只在写之前声明)

代码:

def primeGen():
    global primeRan  
    if primeRan:
        primeList, primeMax = primeList, PrimeCap
        global primeSet
    else:
        global primeSet, primeList, primeCap
        primeRan = True

删除SyntaxWarning。但是,对一个只被读取而不被写入的值进行全局减速似乎是错误的。在

我应该忽略语法警报吗?在


Tags: 代码声明消息错误语法警报全局global
1条回答
网友
1楼 · 发布于 2024-10-01 13:34:06

不,您不能忽略它,而且,从Python开始3.6这个will cease to be a ^{} and instead be updated to an error (^{})。所以您最好现在就修复它,或者面对它在未来版本中不执行的前景(>= 3.6)。在

请参阅^{} statement上的文档:

Names listed in a global statement must not be used in the same code block textually preceding that global statement.

正如您所注意到的,这不是在运行时生成的警告,它是在Python编译函数对象时生成的,并注意到一个包含名称(primeRan)的global语句,该语句已被发现为本地的。在

您应该在引用primeRan之前添加global语句,并对同样问题的受害者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不是一个好的实践。我看不出有什么理由需要诚实地使用它们,最好不要使用globals,而是使用参数和返回值与函数进行通信(从概念角度和执行速度角度来看)。在

相关问题 更多 >