Python中如何不使用全局变量在函数间传递列表?
解决Python中避免全局变量传递数据集的问题
嘿,很高兴帮你搞定这个问题!避免使用全局变量确实是个值得坚持的好习惯——它能让你的代码更模块化、更容易调试和维护。针对你的场景,这里有两个实用的方案来传递加载好的数据集给其他函数:
方案1:让加载函数返回数据集,显式传递给其他函数
最直接的方式就是修改loadFile函数,让它在完成数据加载后返回这个数据集,然后在调用其他处理函数时,把这个数据集作为参数传进去。这样完全不需要全局变量,所有数据的流向都清晰可见。
修改后的代码示例:
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(data_set, 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") # 调用示例(放在主程序入口里) if __name__ == "__main__": # 先加载数据,拿到返回的数据集 weather_data = loadFile("weather.csv") # 把数据集传给avgDay函数 avgDay(weather_data, "01-05") # 其他需要处理数据的函数也用同样的方式传递 # temp_range(weather_data, "01-05") # humidity_avg(weather_data, "July")
方案2:用类封装数据和处理函数
如果你的项目中有多个需要处理该数据集的函数,用类来封装会更优雅。把数据集作为类的实例属性,类内的所有方法都可以直接访问它,不用每次都手动传递参数,代码结构也更整洁。
示例代码:
import csv import sys class WeatherDataProcessor: def __init__(self): self.data_set = [] # 实例属性,类内所有方法都能直接访问 def loadFile(self, x): with open(x, "r") as readfile: csv_reader = csv.reader(readfile, delimiter= ';') for row in csv_reader: self.data_set.append(row) print("Loaded weather data from", (x[0:-4]).capitalize()) print() def avgDay(self, x): for line in self.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 maxTempWeek(self, week_num): # 直接使用self.data_set进行处理 pass # 调用示例 if __name__ == "__main__": processor = WeatherDataProcessor() processor.loadFile("weather.csv") processor.avgDay("01-05") # 其他处理函数直接调用即可,不用传数据集 # processor.maxTempWeek(2)
两个方案各有优势:方案1简单直接,适合函数数量不多的小型项目;方案2的封装性更好,适合有多个相关处理函数的场景,后续扩展功能也更方便。
内容的提问来源于stack exchange,提问作者Alexander Kerr
相关产品推荐
相关产品推荐

