簡體   English   中英

Python:對象具有相同的值?

[英]Python: Objects have the same value?

我有一個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的定義。 現在,它是一個在所有實例之間共享的類變量,因此它保留了創建的最后一行。

嘗試:

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])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM