首页 > 解决方案 > 为什么一个变量是全局访问的,而另一个变量不在 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_nodesbfs函数来解决这个问题。

bfs()但是,我的问题是,当我没有将列表传递VertexinitalizeVertex()函数并且函数仍然可以访问和修改它时,为什么我必须将这个列表传递给函数?

此外,我没有将任何参数传递给printData函数,但该函数会打印所有列表和字典而不会出现任何错误。

标签: pythonpython-3.xlistfunctionparameters

解决方案


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

推荐阅读