【问题标题】:python passing list between functionspython在函数之间传递列表
【发布时间】:2013-03-19 01:09:37
【问题描述】:

我正在努力将一个列表(holder,其中包含[0,0])传递给另一个函数。我希望check_neighbours 拿起列表,然后做一些进一步的处理。我想我在main() 中正确传递了它,但我不确定我必须做什么才能让列表在check_neighbours 中被调用时简单地显示其内容。我尝试了= 持有人,但收到错误消息:

全局名称“持有人”未定义

我认为我必须将holder = #something 放在这里,但我不知道是什么。

 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):
        i=0
        j=0
        #point node to pos [0][0] of Alist
        node = Alist[i][j]
        #create a list to hold co-ordinates
        holder = []
        holder.append(i)
        holder.append(j)
        print holder

        return node, holder

#test neighbours to see if they can be used
def check_neighbours(node, Alist):
        holder = #something 



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

【问题讨论】:

    标签: python list parameter-passing


    【解决方案1】:

    start_node 的末尾,你这样做:

    return node, holder
    

    ...但是当你调用它时,你会这样做:

    node = start_node(Alist)
    

    这意味着您的本地 node 变量最终成为 node, holder 的元组。你不想要那个。你想要这个:

    node, holder = start_node(Alist)
    

    同时,你说“我认为我在 main() 函数中正确地传递了它”,但你没有main 函数中传递它:

    holder = check_neighbours(node, Alist)
    

    check_neighbours 无法在此处获取 holder,因为您没有在此处提供 holder

    另外,当您定义 check_neighbours 时,您是这样做的:

    def check_neighbours(node, Alist):
        holder = #something 
    

    这不需要holder 参数,它定义了一个名为holder 的新局部变量。因此,将这两行更改为:

    def check_neighbours(node, Alist, holder):
    

    然后调用它:

    holder = check_neighbours(node, Alist, holder)
    

    另外,请注意,您将check_neighbors 的结果分配回holder 变量,替换您传入的任何内容。通常,这是完全合理的做法(想想my_name = my_name.replace('Joseph', 'Joe')),但请确保这确实是您想要的(当然,请确保 check_neighborsreturn holder 结束,或返回一些其他适当的值)。

    最后,正如我在您的另一个问题中所说:如果您继续为您的参数和传入的值使用相同的名称,您将继续像这样混淆自己。如果您使用不同的名称,您会更容易看到您缺少什么。甚至像每个前缀一样简单的东西:

    def main():
        file = ("F:/media/KINGSTON/Networking/network.txt")
        my_list = create_matrix(file)
        my_node, my_holder = start_node(my_list)
        my_new_holder = check_neighbours(my_node, my_list, my_holder)
    

    【讨论】:

    • 再次感谢您,我对变量传递的工作原理做了很多假设,但非常感谢您的帮助
    • @bigl:这是一个简单的经验法则:变量传递总是完全明确的。如果你有def foo(x, y, z):,它以return v, w结尾,你总是需要用3个值调用它,并将结果存储在2中,比如a, b = foo(c, d, e)。 (这个经验法则在更复杂的情况下会被修改,比如带有方法的类、全局变量等,但暂时忽略这些。)
    • 谢谢你,非常有用的信息。现在一切都很好。
    猜你喜欢
    • 2013-12-17
    • 2013-04-09
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    相关资源
    最近更新 更多