Python:将全局对象声明为实例变量

2024-04-27 09:05:36 发布

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

我正在用Python编写一个严重依赖全局列表变量的应用程序。程序中的每个函数都会对一个或所有这些全局列表应用更改。 在编写代码时,我发现我需要几个函数,涉及全局列表之间元素的移动,所有这些都涉及相同的代码行——因此我编写了一个适当的函子类。在

下面的程序总结了我正在做的事情。我将引用它来描述我的应用程序中出现的问题:

#Global List variables
garbage=[]
paper=[]
metal=None

class movementFunctor:
    def __init__(self,source,destination):
        self.source=source
        self.destination=destination
    def __call__(self,item):
        self.source.remove(item)
        self.destination.append(item)

GtoP=movementFunctor(garbage,paper)
GtoM=movementFunctor(garbage,metal)
PtoM=movementFunctor(paper,metal)

def main():
    global garbage,paper,metal
    metal=[]
    #initialize garbage, paper, and plastic with numbers 0 to 5
    for i in range(5):
        garbage.append(i)
        paper.append(i)
        metal.append(i)
    GtoP(2)

    #Problem Code---------------------------------------------------------------------
    PtoM(2)
    #Problem Code---------------------------------------------------------------------
main()

我的函子类movementFunctor指定源全局变量列表和目标全局变量列表作为实例变量的参数。然后指定从源到目的地的调用。在

我以为这个设计会成功;但是,我在'PtoM(2)'行中遇到了一个错误

^{pr2}$

全局列表之一metal被初始化为None,但main应该为它分配一个新的空列表[]。那么,为什么PtoM函子在分配给它空列表时,会遇到金属被声明为None的问题呢?在

我找不到任何关于将全局变量设置为类的实例变量的问题/复杂性的信息。在

我是新来的堆栈溢出论坛,所以请原谅/指出任何惯例,我没有很好地遵守张贴这个问题。在


Tags: selfnonesource列表maindefitem全局
1条回答
网友
1楼 · 发布于 2024-04-27 09:05:36

您在调用main之前创建了PtoM。当时,metal为None,因此PtoM将其目标设置为None。它不会“监视”变量metal以查看是否分配了其他内容。在

解决方案是在开始时分配metal = [],或者在设置metal之后,将您的{}和其他人的创建移动到{}内。在

相关问题 更多 >