Python: 对象具有相同的值吗?
Python: 对象具有相同的值吗?
我有一个看起来像这样的csv文件:
1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0
2;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0
3;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0
...
16000;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0
我写了以下Python脚本:
import csv path = 'pathToCSV.csv' dLst = [] class Datensatz: # 0:schluesse 1:straftat 2:gemeindeSchluessel 3:stadt 4:kreisart 5:erfassteFaelle 6:HZnachZensus # 7:versucheAnzahl 8:versucheInProCent 9:mitSchusswaffeGedroht 10:mitSchusswaffeGeschossen= # 11:aufgeklaerteFaelle 12:aufklaerungsquote 13:tatverdaechtigeInsgesamt 14:tatverdaechtigeM # 15:tatverdaechtigeW 16:nichtdeutscheTatverdaechtigeAnzahl 17:NichtdeutscheTatverdaechtigeInProCent datensatz = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''] def createDatensatz(row): d = Datensatz() for i in range(0, 17): d.datensatz[i] = row[i] return d def readCSV(): with open(path, 'r', encoding='iso-8859-15') as csvfile: spamreader = csv.reader(csvfile, delimiter=';') for row in spamreader: # 第一个打印 print(createDatensatz(row).datensatz[0]) dLst.append(createDatensatz(row)) for item in dLst: # 第二个打印 print(item.datensatz[0]) if __name__ == "__main__": readCSV()
在我的代码中,第一个打印输出了从1到16000的所有数字,这是正确的!
但是在将对象添加到列表后,第二个打印输出了16000次的最后一个值。
16000 16000 16000 ... 16000
为什么?
问题出在哪里?
在上述代码中,问题的原因是`datensatz`被定义为类变量,因此它在所有实例之间共享,并且保存了最后一行创建的值。
为了解决这个问题,可以将`datensatz`的定义从类中移出。以下是两种解决方法:
方法一:
class Datensatz: def __init__(self): self.datensatz = ['','','','','','','','','','','','','','','','','','']
方法二(更好的方法):
class Datensatz: def __init__(self, row): self.datensatz = row[:] # [:] 进行列表的浅拷贝 def readCSV(): with open(path, 'r', encoding='iso-8859-15') as csvfile: spamreader = csv.reader(csvfile, delimiter=';') for row in spamreader: # 第一次打印 print(Datensatz(row).datensatz[0]) dLst.append(Datensatz(row)) for item in dLst: # 第二次打印 print(item.datensatz[0])
通过上述的修改,问题就可以得到解决。现在每个实例都有自己的`datensatz`值,不再共享同一个变量。