我有一个项目,它看起来像这样:NameError:全局名称 'MAGIC_PINK' 没有定义
PyBlob
|- __init__
|- Actor
|- Blob
|- Bullet
|- main
|- Player
|- Scene
|- utils
|- Zombie
__init__.py
import sys, pygame, cmath
from Actor import Actor
from Blob import Blob
from Bullet import Bullet
from Player import Player
from Scene import Scene
from utils import *
from Zombie import Zombie
utils.py
MAGIC_PINK = (255, 0, 255)
# plus a small handful of utility functions
斑点.py
from PyBlob import *
class Blob:
def __init__(self, radius, body_colour=(0,0,0), face_colour=(255,255,0)):
self.body = pygame.Surface((2*radius, 2*radius))
self.face = pygame.Surface((2*radius, 2*radius))
self.body.set_colorkey(MAGIC_PINK)
#rest of module omitted for brevity
所
这导致错误:
NameError: global name 'MAGIC_PINK' is not defined
导入类似乎做工精细这么清楚,我做错了这个MAGIC_PINK变量。
由于python JIT编译为字节码,编译器不应该在运行时解决这个问题吗?这在其他语言中不是问题,例如Java的。 –
@BlaiddDrwg:没有。一个模块包含的变量直到运行时才会知道;你可以把'if today_is_wednesday():x = 3'放在一个模块中,如果它在周三被加载,它将只有一个'x'变量。 '从foo导入*'不改变名称查找规则以查找'foo',如果它没有找到全局;它会查找'foo'中所有不以下划线开头的名称,并将其当前值赋给当前名称空间中的同名变量。 – user2357112
在Java中有一个非常类似的问题 - 不是循环导入(因为Java *中的导入*只是更改了一些编译时名称查找规则),而是使用循环类加载。 Java类可以[在类加载时执行任意代码](http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html),它可以触发加载其他类。如果加载Foo类触发加载类Bar,并且加载Bar触发加载Foo,则JVM将取消Foo的递归加载并将其用于半加载。 – user2357112