我有一个功能,menu(),它创建一个菜单来导航和调用功能。这是功能。
def menu():
x = raw_input("WOOF! What can POODLE fetch for you? ('--nothing' to exit): ")
if x == "--nothing":
sys.exit(0)
elif x == "--build":
populateCrawled(toCrawl)
graph = buildGraph(crawled)
index = buildIndex(graph)
ranks = computeRanks(graph)
menu()
elif x == "--dump":
saveFile(index, "index.txt")
saveFile(graph, "graph.txt")
saveFile(ranks, "ranks.txt")
menu()
elif x == "--restore":
index = loadFile("index.txt")
graph = loadFile("graph.txt")
ranks = loadFile("ranks.txt")
menu()
elif x == "--print":
print graph
print index
print ranks
menu()
elif x == "--help":
print "WOOF! POODLE Help Options"
print "--build Create the POODLE database"
print "--dump Save the POODLE database"
print "--restore Retrieve the POODLE database"
print "--print Show the POODLE database"
print "--help Show this help information"
menu()
elif x == "--search":
search(index, rankablePages)
else:
print "Help option not found"
menu()
seed = raw_input("Please enter the seed URL: ")
testSeed = "https://dunluce.infc.ulst.ac.uk/d11ga2/COM506/AssignmentB/test_index.html"
seed = testSeed
toCrawl=[seed]
crawled, graph, index, rankablePages = [], {}, {}, {}
MAX_DEPTH = 10
menu()
这些变量和词典都是全局声明的,但是当我说“--build”类型时它确实成功构建但是如果我去输入“--print”它会显示我 UnboundLocalError:赋值前引用的局部变量“graph”
然而,如果我在建造后立即打印这些词典,那么它们打印得很好。当重新加载menu()时,它会丢失这些值。我应该使用while循环还是需要做一些参数传递?
答案 0 :(得分:1)
这些变量在全球范围内宣布这一事实并没有帮助(尽管请注意,并没有实际上全局定义ranks
...),因为他们'在本地声明了 ,本地名称隐藏了全局名称。
每当你在函数体中编写spam = eggs
时,会使spam
成为局部变量,并且函数中出现spam
的任何地方,它就会引用该局部变量。< / p>
如果您想创建一些全局内容,但仍然可以分配给它,则需要global
statement。所以:
def menu():
global graph, index, ranks
# the rest of your code
但与往常一样,更好的解决方案是停止使用全局变量。
一个选项创建一个类来保存你的状态,使menu
成为该类的方法,并使类graph
和朋友属性成为类的实例
但这里有一个更简单的选择。您需要这些变量是全局的唯一原因是因为menu
递归地调用自身来模拟循环。由于其他原因,这在Python中已经很糟糕了。 (例如,如果你通过菜单大约999次,你将会得到一个递归错误。)如果你只是使用一个循环而不是试图伪造它,你可以只使用局部变量:
def menu(graph, index, ranks):
while True:
# the rest of your code except the menu() calls
# ...
crawled, graph, index, rankablePages = [], {}, {}, {}
menu(graph, index, ranks)
答案 1 :(得分:0)