For循环中的Python List Bug

时间:2017-09-01 14:05:25

标签: python arrays django python-3.x csv

我不确定如何描述这个问题,但我会尝试一下。

背景信息

我的Django Web应用程序中有一个用户可以导入其他用户的功​​能。用户可以通过拖放导入.csv文件转换为JSON 2D数组(使用Papaparse JS)

在视图中,我遍历2D数组中的元素并创建一个" Importuser"其中包含一些属性,如" firstname"," lastname",email等等。

class Importuser:
   firstname = None
   lastname = None
   email = None
   import_errors = []
   def __init__(self, fn, ln, e):
      self.firstname = fn
      self.lastname = ln
      self.email = e

class Importerror:
   message = None
   type = None
   def __init__(self, m, t):
      self.message = m
      self.type = t

在for循环中,我还验证了电子邮件地址,因此没有加倍的用户。

data = jsonpickle.decode(method.POST["users"])
users = []
for tempuser in data:
   u = validate(Importuser(tempuser[0], tempuser[1], tempuser[2])
   users.append(u)

在验证功能中,我检查是否有任何用户使用相同的电子邮件

def validate(user : Importuser):
   user_from_db = User.objects.filter(email=user.email)
   if user_from_db:
      user.import_errors.append(Importerror("The user exists already!", "doubleuser"))
   return user

问题

for循环完成后所有用户都有相同的错误,但在执行for循环时打印每个用户时没有。每个用户中的Importerror-Object引用相同的内存位置,但在我的测试导入中应该只有一个用户有错误。

test.csv:

Dave,Somename,dave@example.com
Joe,Somename2,joe@example.com
Yannik,Somename3,yannik@example.com <<That's me (exsiting user)

我做错了什么?有人可以帮我理解为什么会这样吗?

2 个答案:

答案 0 :(得分:1)

您已将import_errors定义为类级静态,因此它在Importuser的所有实例之间共享。

请参阅:Static class variables in Python

针对您的特定问题,请将您的课程重写为

class Importuser:
   def __init__(self, firstname, lastname, email):
      self.firstname = firstname
      self.lastname = lastname
      self.email = email
      self.import_errors = []

class Importerror:
   def __init__(self, message, type):
      self.message = message
      self.type = type

答案 1 :(得分:0)

import_errorsImportUser的类属性。它应该是一个instance-attribute:

class Importuser:

   def __init__(self, fn, ln, e):
      self.firstname = fn
      self.lastname = ln
      self.email = e
      self.import_errors = []