导入python模块之前设置的变量不是';t被模块识别

导入python模块之前设置的变量不是';t被模块识别,python,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 cod

这是我的密码:


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这样的变量


为什么?

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

在您的代码中,
badcomp
模块中的
getlist
函数正在尝试与多个全局变量交互,包括用于输出的
badx
bady
,以及用于输入的
data
list2
。它不起作用,因为您已经在交互式会话中定义了它们,该会话使用具有特殊名称的模块的名称空间
\uuuu main\uuuu

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


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

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

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

将其放入导入的模块中:

def putVarsInNamespace(变量,variableNameToInject)
exec(“全局%s”%variableName)
exec(“%s=变量”%variableName)
将其放入调用模块:

test=5
从导入putVarsInNamespace
putVarsInNamespace(测试,“测试”)

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

在Python中导入模块时,它无权访问从中导入的模块中的任何代码。代码不会复制到导入语句的位置。您可以将要修改的项作为参数传递给
getlist