如何在python中重新加载命名空间? [复制]
Posted
技术标签:
【中文标题】如何在python中重新加载命名空间? [复制]【英文标题】:how to reload the namepace in the python? [duplicate] 【发布时间】:2012-04-26 15:49:17 【问题描述】:from math import sqrt
def sim_distance(prefs,person1,person2):
si=
for item in prefs[person1]:
if item in prefs[person2]:
si[item]=1
if len(si)==0: return 0
sum_of_squares=sum([ pow ( prefs[person1] [item] - prefs[person2][item],2)
for item in prefs[person1] if item in prefs[person2]])
return 1/(1+sqrt(sum_of_squares))
reload(recommendations)
recommendations.sim_distance(critics,'Lisa Rose','Gene Seymour')
这是错误
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
recommendations.sim_distance(critics,'Lisa Rose','Gene Seymour')
NameError: name 'critics' is not defined
critics 是一个自定义数组
【问题讨论】:
你在哪里初始化critics
?
在 Recommendations.py 中,在 sim_distance 之前
如果您可以包含初始化批评者的代码,我想我们可以找出问题所在。正如下面已经提到的,解释器告诉你它在当前范围内没有任何名为 critics
的东西。我猜你是在一个函数中定义它,这意味着一旦函数返回它就不再在范围内了。
是的,这是范围问题,我在函数外部的全局范围中定义了critic,然后它就可以解决。但是如果我下次要使用critic,我必须每次都初始化它吗?是否有更简单的定义方法,比如保存在一个文件中以便我调用。
@Andrew Barrett:太复杂了,我现在看不懂。无论如何谢谢。
【参考方案1】:
这与重新加载命名空间没有任何关系。你根本没有定义critics
。
【讨论】:
我已经写在recommens.py中,在sim_distance()之前。我应该在其他地方定义它吗? @MindHacks:也许你的意思是 Recommendations.critics? 是的,我已经解决了这个问题。谢谢~【参考方案2】:这看起来可能是范围问题。如果您在不同的功能中定义评论家,那么评论家将只存在于该功能中。您在此函数的主要范围内引用了评论家,因此您需要从创建它的函数中返回评论家,或者(不理想)最初在全局范围内定义它。
def initCritics():
critics = []
# make some critics
return critics
critics = initCritics()
recommendations.sim_distance(critics,'Lisa Rose','Gene Seymour')
【讨论】:
谢谢!很有帮助。以上是关于如何在python中重新加载命名空间? [复制]的主要内容,如果未能解决你的问题,请参考以下文章