python - 为什么一个变量是全局访问的,而另一个变量不在 Python 中?
问题描述
我正在尝试实现一个简单的 BFS 代码。
代码:
def initalizeVertex():
n = int(input('Enter the no. of vertices.\n'))
for vertex in range(n):
Vertex.append(vertex)
node_adjacency[vertex] = []
def initalizeUndirectedEdges():
n = int(input("Enter the no. of edges.\n"))
print("Enter the space seperated edges.")
for i in range(n):
a,b = map(int,input().split())
node_adjacency[a].append(b)
node_adjacency[b].append(a)
def bfs():
current_level = 1
print(Vertex)
while(current_level_nodes):
for current_node in current_level_nodes:
for child_node in node_adjacency[current_node]:
if node_parent.get(child_node) == None:
node_parent[child_node] = current_node
next_level_nodes.append(child_node)
node_level[child_node] = current_level
current_level_nodes = [node for node in next_level_nodes]
next_level_nodes = []
current_level += 1
print(node_level)
print(node_parent)
def printData():
print(Vertex)
print(node_adjacency)
print(node_parent)
print(node_level)
print(current_level_nodes)
print(next_level_nodes)
if __name__ == "__main__":
root = 0
Vertex = []
node_adjacency = {}
node_parent = {root:None}
node_level = {root:0}
current_level_nodes = [root]
next_level_nodes = []
initalizeVertex()
initalizeUndirectedEdges()
printData()
bfs()
代码输出为:
这段代码给了我错误:
in bfs
while(current_level_nodes):
UnboundLocalError: local variable 'current_level_nodes' referenced before assignment
显然,该bfs()
函数无法访问 list current_level_nodes
。我可以通过将列表传递current_level_nodes
给bfs
函数来解决这个问题。
bfs()
但是,我的问题是,当我没有将列表传递Vertex
给initalizeVertex()
函数并且函数仍然可以访问和修改它时,为什么我必须将这个列表传递给函数?
此外,我没有将任何参数传递给printData
函数,但该函数会打印所有列表和字典而不会出现任何错误。
解决方案
Python 将尝试在本地范围 1 中查找变量。如果在本地找不到它们,Python 将在全局范围内查找它们。
例如 -
在您的 printData() 函数中 - Python 将尝试在本地查找变量,但此方法中未定义任何变量。因此,Python 将进入全局范围。它将选择值并打印它们。
def printData():
print(Vertex)
print(node_adjacency)
print(node_parent)
print(node_level)
print(current_level_nodes)
print(next_level_nodes)
在另一个函数 bfs() -
Python 将在一段时间内看到 current_level_nodes,Python 将尝试查找变量的定义位置。由于您稍后在函数中分配了相同的变量,因此事情会变得棘手。这会使 Python 感到困惑,并且会抛出错误。
line 1. - while(current_level_nodes):
line 2. - current_level_nodes = [node for node in next_level_nodes]
这就是为什么你需要明确告诉 Python 你想使用全局变量 -
global current_level_nodes
推荐阅读
- java - Java Maze SwingWorker - 用户输入导致问题
- visual-studio-code - 为 vscode 安装代码运行程序而苦苦挣扎
- javascript - 在 React 中从 createElement 开始重放 gif
- html - 在 svg 中的多边形上添加按钮
- function - 选中复选框时调用函数 - Google 表格
- python - Python中的动态功率计算
- php - 实时获取在棘轮php中断开连接的客户端的客户端资源ID
- java - IntelliJ:如何将文本文件和图像等资源复制到构建路径?
- pandas - 如何一次性重命名所有列名
- javascript - 获取jquery对话框的ui元素值