这是我的密码:
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
。它不起作用,因为您已经在交互式会话中定义了它们,该会话使用具有特殊名称__main__
的模块名称空间虽然可以从
badcomp
导入__main__
,并通过模块的属性与其中定义的全局变量交互,但这将是一个非常糟糕的设计,因为如果以任何其他方式导入模块(例如,通过稍后编写的另一个模块导入),则该设计将不起作用。相反,函数可能应该使用在其自己的全局命名空间中定义的变量。__main__
模块已经在导入badcomp
(作为bc
),如果将定义移动到模块中,则可以访问badx
和bady
等内容或者,您可能会重新考虑全局变量是否是该函数工作的最佳方式。通常,使用参数和返回值将数据传入和传出函数比使用全局变量要好得多。也许
badx
和bady
应该在结尾的getlist
和return
中定义。同时,data
和list2
可以作为参数添加到函数中导入模块时,它无权访问调用该模块的模块的全局或本地命名空间。您可以通过创建一个函数来解决这个问题,该函数在导入的模块内的全局命名空间中创建一个变量,并使用所需的每个变量从调用模块运行该函数
示例代码(非常糟糕的设计,但希望它能教会您):
将其放入导入的模块中:
将其放入调用模块:
工作原理:
variableNameToInject
是您希望调用注入变量的名称。然后它运行global variableNameToInject
,但它使用variableNameToInject
的值,这是应该调用注入变量的名称。当您希望在不使用多个函数的情况下注入多个变量时,这非常有用。然后它将变量名(值variableNameToInject
)设置为值variable
,就像它被注入一样相关问题 更多 >
编程相关推荐