导入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
(asbc
),如果将定义移动到模块中,则可以访问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