模块无法识别在导入python模块之前设置的变量

2024-09-29 23:19:03 发布

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

这是我的密码:


import numpy as np
import matplotlib.pyplot as plt
import astropy
import matplotlib
%matplotlib ipympl
import scatterplot_with_hist as sc
badx=[]
bady=[]
import badcomp as bc

#things like data5 and list2 are defined in here--I know that code is functional so I'll omit it for brevity

bc.getlist(start = 2000, end = 2200)

模块代码如下:

def getlist(start, end):
    for f in range(1):
        for i in range(1238):
            for n in range(int(start),int(end)):
                if ((data[n]['col1'] - list2[i]) == 0):
                    badx.append(data[n]['col2'])
                    bady.append(data[n]['col3'])

如果我在常规空间中运行这段代码(而不是导入它并将其作为函数运行),它可以正常工作。当我以导入函数的形式运行它时,它不会识别像data5、list2、badx和bady这样的变量

为什么?


Tags: inimportfordatamatplotlibasrangestart
2条回答

每个Python模块都有自己的全局名称空间。这意味着在不同模块中,每个模块试图访问全局变量的代码将看到单独的变量。通过导入模块并与模块对象的属性交互,可以访问其他模块的全局变量

在您的代码中,badcomp模块中的getlist函数试图与多个全局变量交互,包括输出的badxbady,输入的datalist2。它不起作用,因为您已经在交互式会话中定义了它们,该会话使用具有特殊名称__main__的模块名称空间

虽然可以badcomp导入__main__,并通过模块的属性与其中定义的全局变量交互,但这将是一个非常糟糕的设计,因为如果以任何其他方式导入模块(例如,通过稍后编写的另一个模块导入),则该设计将不起作用。相反,函数可能应该使用在其自己的全局命名空间中定义的变量。__main__模块已经在导入badcomp(作为bc),如果将定义移动到模块中,则可以访问badxbady等内容

或者,您可能会重新考虑全局变量是否是该函数工作的最佳方式。通常,使用参数和返回值将数据传入和传出函数比使用全局变量要好得多。也许badxbady应该在结尾的getlistreturn中定义。同时,datalist2可以作为参数添加到函数中

导入模块时,它无权访问调用该模块的模块的全局或本地命名空间。您可以通过创建一个函数来解决这个问题,该函数在导入的模块内的全局命名空间中创建一个变量,并使用所需的每个变量从调用模块运行该函数

示例代码(非常糟糕的设计,但希望它能教会您):

将其放入导入的模块中:

def putVarsInNamespace(variable, variableNameToInject)
    exec("global %s" % variableName)
    exec("%s = variable" % variableName)

将其放入调用模块:

test = 5
from <MODULENAME> import putVarsInNamespace
putVarsInNamespace(test, "test")

工作原理:variableNameToInject是您希望调用注入变量的名称。然后它运行global variableNameToInject,但它使用variableNameToInject的值,这是应该调用注入变量的名称。当您希望在不使用多个函数的情况下注入多个变量时,这非常有用。然后它将变量名(值variableNameToInject)设置为值variable,就像它被注入一样

相关问题 更多 >

    热门问题