【问题标题】:How to pass list from one function to another without using global variable?如何在不使用全局变量的情况下将列表从一个函数传递到另一个函数?
【发布时间】:2020-05-09 15:48:04
【问题描述】:

我对 python 很陌生,目前正在尝试一个项目,该项目要求用户从 csv 文件中读取数据,并存储该数据以便可以对其执行其他功能。目前我似乎遇到的唯一问题是我不能使用全局变量

刚才我的代码结构如下:

import csv
import sys
data_set = []

def loadFile(x):
    with open(x, "r") as readfile:
        csv_reader = csv.reader(readfile, delimiter= ';')
        for row in csv_reader:
            data_set.append(row)
    print("Loaded weather data from", (x[0:-4]).capitalize())
    print()

def avgDay(x):
    for line in data_set:
        if(len(x) == 5 and (x[3:5] + "-" + x[0:2]) in line[0]):
           print("The weather on", x, "was on average", line[2], "centigrade")

有什么方法可以调用 data_set 到其他函数吗? (我还有一些需要处理数据的函数)。

【问题讨论】:

  • main的起点吗?
  • other_function(data_set)…‽
  • 只使用函数参数和返回值。 loadFile 可以return 列表中的数据,avgDay 可以将该数据作为参数。
  • 你说的不能使用全局变量是什么意思?当您尝试使用它时会抛出错误吗?此外,您始终可以将函数和数据封装到一个类中……这样您就可以使用self 来获取数据。
  • 列表是一个对象。虽然它的引用是按值传递的,但内容可以在函数之间共享。

标签: python list function local


【解决方案1】:

可以,直接作为参数传入,在最初生成的时候返回。

import csv
import sys

def loadFile(x):
    date_set = []
    with open(x, "r") as readfile:
        csv_reader = csv.reader(readfile, delimiter= ';')
        for row in csv_reader:
            data_set.append(row)
    print("Loaded weather data from", (x[0:-4]).capitalize())
    print()
    return data_set

def avgDay(x, data_set):
    for line in data_set:
        if(len(x) == 5 and (x[3:5] + "-" + x[0:2]) in line[0]):
           print("The weather on", x, "was on average", line[2], "centigrade")

def main():
    data_set = loadFile(...)
    avgDay(..., data_set)

if __name__ == 'main':
    main()

【讨论】:

  • 好吧,看来我说得太早了,使用此方法时出现 data_set not defined 错误,但那是因为我没有使用 main,我使用以下格式返回我的函数。 def menu_number(): number = int(input("Choose what to do: ")) if (number) == 1: x = input("Give name of the file: " ) loadFile(x) print_menu() menu_number() elif (number) == 2: x = input("Give a date (dd.mm): ") avgDay(x, data_set) lowHigh(x, data_set) rain(x, data_set)
  • @AlexanderKerr 抱歉,您将不得不在网站上提出一个新问题,在 cmets 中调试太难了。
  • 会做,我之前想过,然后删除,因为我在这里有这个。
  • 发布了新问题并提交了完整代码,问题是@stackoverflow.com/questions/61828948/…,希望您能就我哪里出错了?
【解决方案2】:

您的 loadFile 函数可以返回可在 avgDay 中使用的数据集

import csv
import sys


def loadFile(x):

    data_set = []

    with open(x, "r") as readfile:
        csv_reader = csv.reader(readfile, delimiter= ';')
        for row in csv_reader:
            data_set.append(row)
    print("Loaded weather data from", (x[0:-4]).capitalize())
    print()

    return data_set

def avgDay(x):

    data_set = loadFile(x)

    for line in data_set:
        if(len(x) == 5 and (x[3:5] + "-" + x[0:2]) in line[0]):
           print("The weather on", x, "was on average", line[2], "centigrade")

【讨论】:

    【解决方案3】:

    只有当你使用全局这个词时才能设置全局变量

    您可以访问全局变量而无需任何特殊操作

    data_set = "global_var" #global
    
    def print_global_data_set():
        print(data_set)
    
    def set_global_data_set():
        global data_set # you need this line to tell python that you are going to set a global variable
        data_set = 'global_var_set_from_function'
    
    def set_local_data_set():
        data_set = "local" # this will not set the global var but a local var so the global data_set stays unchanged
    
    print(data_set) # outputs "global_var"
    set_local_data_set()
    print_global_data_set() # outputs "global_var" (set_local_data_set did not set the global var but a local var)
    set_global_data_set()
    print_global_data_set() # outputs "global_var_set_from_function"
    

    【讨论】:

    • 这种说法并不完全正确,不是吗?如果我在函数范围之外定义了一个变量,该变量会自动分配一个全局状态。
    【解决方案4】:

    函数可以有属性。您可以将 data_set 设为 loadFile 的一个属性,然后在 avgDay 中引用它。

    with open(x, "r") as readfile:
    
        csv_reader = csv.reader(readfile, delimiter= ';')
    
        for row in csv_reader:
    
            data_set.append(row)
    
        loadFile.data_set_attr = data_set
    

    然后,在 avgDay 中,引用 loadFile.data_set_attr

    【讨论】:

    • 但是为什么……
    猜你喜欢
    • 2017-03-26
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多