【问题标题】:Python: Objects have the same value?Python:对象具有相同的值?
【发布时间】:2017-04-14 02:06:13
【问题描述】:

我有一个如下所示的 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:
            #First print
            print(createDatensatz(row).datensatz[0])
            dLst.append(createDatensatz(row))

    for item in dLst:
        #second print
        print(item.datensatz[0])


if __name__ == "__main__":
    readCSV()

对于我的代码中的第一次打印,我得到了从 1 到 16000 的所有数字,这是正确的!

但是在将对象添加到我的列表后的第二次打印,我得到了最后一个值的 16000 倍。

16000
16000
16000
...
16000

为什么? 问题出在哪里?

【问题讨论】:

  • Datensatz.datensatz 是一个类成员,在Datensatz 的所有实例之间共享。您必须为您的班级创建一个__init__ 并在那里初始化实例成员。

标签: python


【解决方案1】:

您需要将datensatz 的定义从类中移出。现在它是一个在所有实例之间共享的类变量,所以它保存了最后创建的行。

试试:

class Datensatz:
    def __init__(self):
        self.datensatz = ['','','','','','','','','','','','','','','','','','']

或更好:

class Datensatz:
    def __init__(self, row):
        self.datensatz = row[:]  # [:] is making a shallow copy of the list.


def readCSV():
    with open(path, 'r', encoding = 'iso-8859-15') as csvfile:
        spamreader = csv.reader(csvfile, delimiter=';')
        for row in spamreader:
            #First print
            print(Datensatz(row).datensatz[0])
            dLst.append(Datensatz(row))

    for item in dLst:
        #second print
        print(item.datensatz[0])

【讨论】:

    猜你喜欢
    • 2011-08-19
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 2020-08-23
    相关资源
    最近更新 更多