Python 在函数之间传递变量

0 投票
2 回答
5249 浏览
提问于 2025-04-17 19:32

我正在尝试把一个整数传递给一个函数。我觉得可能是因为我调用这个函数的次数太多了,所以没有成功。比如,我在一个叫 Alist 的函数里创建了一个二维矩阵,然后把它返回。在第二个函数里,我把 Alist 传过去,并指定一个位置来获取我想要的值,然后再返回这个值。最后(到目前为止),第三个函数会请求返回的值和 Alist。Alist 打印出来没问题,但返回的值(node)打印出来是 0,而我希望它是 4。我猜这可能是因为代码顶部声明的 node = 0 这个变量在作怪,但我不太确定为什么会这样。

network.txt 的第一行看起来是这样的: 0,2,4,1,6,0,

Alist = []
node = 0

file = ("F:/media/KINGSTON/Networking/network.txt")

def create_matrix(file):
    with open('network.txt') as f:
        Alist = []
        for line in f:
            part = []
            for x in line.split(','):
                part.append(int(x))
            Alist.append(part)
    return Alist

def start_node(Alist):
        node = Alist[0][2]
        print (node)
        return node

#test neighbours to see if they can be used
def check_neighbours(node, Alist):
        print (Alist)
        print (node)
        #check for neighbours. if we start at [0][0] we must look for [0][1]
        #and [1][0]. Figure out how to add 1 to each cell to navigate across.

#running of code begins here
Alist = create_matrix(file)
start_node(Alist)
check_neighbours(node, Alist)

2 个回答

-1

在函数 create_matrix 中,当你写 Alist = [] 的时候,其实是创建了一个新的局部变量 Alist,这个新变量会遮盖掉全局变量 Alist。你可以试试下面的代码:

def create_matrix(file):
    global Alist  # Mark Alist as global variable
    with open('network.txt') as f:
        Alist = []
        for line in f:
            part = []
            for x in line.split(','):
                part.append(int(x))
            Alist.append(part)
    return Alist

想了解更多,可以查看 global 关键字的文档

2

你的问题出在“代码运行从这里开始”的第二行:

Alist = create_matrix(file) 
start_node(Alist) 
check_neighbours(node, Alist)

当你调用 start_node(Alist) 时,它会创建一个局部变量(这个变量叫 node),然后返回这个变量的值,但你并没有使用这个值。这就意味着全局变量 node(虽然名字一样)并没有被改变,所以它的值还是0。

要让这个代码正常工作,你需要做和上面那行代码一样的事情:

node = start_node(Alist) 

不过,为了让你的代码更清晰,你应该做几件事:

首先,去掉顶部的 Alist = []node = 0。在函数之前定义这些变量会让人觉得你希望在函数内部使用它们作为全局变量,这样会让人困惑。(同样的道理也适用于 file——你确实需要定义它,但不需要放在最上面。)

然后,如果你把所有顶层的内容(包括这两个全局变量)放到一个函数里,这样就不会造成混淆了。

所以,保留你的三个函数定义,然后:

def main():
    file = ("F:/media/KINGSTON/Networking/network.txt")
    Alist = create_matrix(file)
    node = start_node(Alist)
    check_neighbours(node, Alist)
main()

撰写回答