Python: 对象具有相同的值吗?

10 浏览
0 Comments

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

为什么?

问题出在哪里?

0
0 Comments

在上述代码中,问题的原因是`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`值,不再共享同一个变量。

0