【问题标题】:python passing variables between functionspython在函数之间传递变量
【发布时间】:2013-03-07 04:22:56
【问题描述】:

我正在尝试将整数传递给函数。我认为它可能不起作用,因为我多次调用它?例如,我在一个名为 Alist 的函数中创建了一个二维矩阵,然后将其返回。使用第二个函数,我通过 Alist 并为我想要从 Alist 中返回的值指定一个位置。最后(到目前为止),第三个函数将要求返回值和 Alist。 Alist 打印正常,但返回的值(节点)在应该为 4 时打印 0。我猜它正在使用代码顶部声明的 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)

【问题讨论】:

  • 您需要向我们展示调用这些函数的代码。理想的问题是SSCCE——我们可以根据您的输入运行该问题,并查看输出与预期输出有何不同。
  • 同时,全局变量、函数参数和局部变量都具有相同的名称是很令人困惑的,这是一个危险信号,您期望我们的代码中有某种魔法' t 看到。例如,在start_node 中设置的node 不是全局的。它正在被返回,但除非调用者正在执行类似node = start_node(Alist) 之类的操作来设置全局,否则全局不会改变,因此该值仍将为 0。

标签: python variables parameter-passing


【解决方案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 keyword documentation 中查看更多信息。

【讨论】:

  • 这不是他的问题。他有一个Alist = create_matrix(file),它将全局替换为此函数返回的值。此外,正如他在问题中所说,“Alist 打印良好”。 node 不起作用。同时,鼓励他从传递和返回变量切换到共享全局变量并不是一个很好的设计选择。
【解决方案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()

【讨论】:

    猜你喜欢
    • 2013-04-09
    • 1970-01-01
    • 2019-06-28
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    相关资源
    最近更新 更多