此问题在此处已有答案:
"Least Astonishment" and the Mutable Default Argument(32个答案)
16天前关闭。
我正在学习Python中的数据处理,尝试处理10月的每一天的天气数据。数据来自本地csv。我对一个月中的每一天进行迭代,并对其中的每一小时进行迭代。我有一个类对象来处理每一天的数据。类对象在每一天的迭代后立即进行初始化。问题是,这个对象不会在每次迭代后重新初始化。我在它下面做了一些测试对象。测试对象和对象之间的区别是,这个对象是一个子文件夹中的对象,它包含了我所有的数据处理.这个对象包含了一个数据容器类对象的列表,它们的源文件位于同一目录中。
--主类别--
`
import os
import csv
from Data.VejrData import *
#Test class
class Ekstra:
streng: str = ""
class Vejr:
currentDirectory: str = os.getcwd()
dataDirectory: str = 'Data/vejrdata/'
folder = os.listdir(currentDirectory+"/"+dataDirectory)
days: list[VejrData] = []
def __init__(self):
self.main()
def fetchData(self):
for file in self.folder:
vejrData = VejrData()
#Error!
#For each file vejrData should be reset, but doesn't
#For each file(31 iterations), all rows from the 32 iterations are being added(25 each * 31 = 248000 sets of data)
#Testing
string = ""
string += "New day"
print(string)
#Testing if the same happens with an empty class object.
ekstra = Ekstra()
ekstra.streng += "New day"
print(ekstra.streng)
#This variable from class object does get reset.
#VejrData doesn't.
#Opens datafile from a specifik date.
with open(f"{self.dataDirectory}{file}", 'r') as data:
csvreader = csv.reader(data)
number = 0
for row in csvreader:
number += 1
index: int = 0
#iterates each element of data in a string.
for textData in row[0].split(";"):
vejrData.constructData(index, textData)
index += 1
self.days.append(vejrData)
def main(self):
self.fetchData()
print(len(self.days))
for day in self.days:
print(len(day.timeData))
vejr = Vejr()
'从主函数打印结果:len(self.days)= 32每天每小时数据集的长度= 775(对于所有32天)。775/25(24 + 1标题)= 31
--数据处理--'
from .TimeData import TimeData
#https://docs.python.org/3/tutorial/modules.html#intra-package-references
class VejrData:
#Lists containing hourly data
timeData: list[TimeData] = []
#Variable retrieving data before being added to list.
DataBuilder: None
#Distributing data from index: index 0 = time data, index 1 = prec data ...
def constructData(self,index: int, data):
#https://www.freecodecamp.org/news/python-switch-statement-switch-case-example/
match index:
case 0:
self.DataBuilder = TimeData()
self.DataBuilder.tid = data
case 1:
self.DataBuilder.prec = data
case 2:
self.DataBuilder.metp = data
case 3:
self.DataBuilder.megrtp = data
case 4:
self.DataBuilder.mesotp10 = data
case 5:
self.DataBuilder.meanwv = data
self.timeData.append(self.DataBuilder)
self.DataBuilder = None
case _:
print(f"Error - Index not at index: {index}, is out of range.")
`
--容器类--'
class TimeData:
tid: int
prec: float
metp: float
megrtp: float
mesotp10: float
meanwv: float
`
结构如下:/Vejr.py,/Data/VejrData & /Data/TimeData。没有发生与路径相关的错误。我可以在每个循环的末尾给予它一个新变量,但这似乎是错误的,因为这是在做循环应该做的事情。
我试过测试重新初始化是否不打算在for循环中发生。我创建了一些对象来看看它们是否会受到它的影响。我从字符串变量开始。当字符串变量被重新初始化时,我试着用同一文件中的另一个类对象,改变它内部的一个变量,看到它也重新初始化了。
因此,变量和类对象在每次迭代中都要重新初始化。
2条答案
按热度按时间93ze6v8z1#
......在每次迭代中都要重新初始化
timeData是一个类属性,因为它有一个可变的默认值,VejrData的每个示例都将 * 指向 * 完全相同的列表。
使timeData成为示例属性。
第一次
jc3wubiy2#
感谢您对我的问题的快速回复。我确实遇到了可变默认值。在将初始值设置为none并在稍后添加它之后,我创建了32个唯一的数据集,而不是一个。