使用for循环将@classmethod创建的对象添加到Python列表中

使用for循环将@classmethod创建的对象添加到Python列表中,python,list,class,for-loop,object,Python,List,Class,For Loop,Object,我为变量homeTasks分配了以下值列表: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] 我有一个for循环将类Task的对象列表分配给变量allTasks # create empty allTasks list allTasks=[] # create thisTask for every value of homeTasks and append to allTasks for y in range(len(homeTasks)):

我为变量
homeTasks
分配了以下值列表:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
我有一个for循环将类
Task
的对象列表分配给变量
allTasks

# create empty allTasks list
allTasks=[]

# create thisTask for every value of homeTasks and append to allTasks
for y in range(len(homeTasks)):
        thisTask = Task.get_task(homeTasks[y])
        allTasks.append(thisTask)
        print(allTasks[y].taskName)

# print task names from allTasks for testing:
for z in range(len(allTasks)):
        print(z)
        print(allTasks[z].taskName)

这给了我以下信息:

Do Dishes
Make Bed
Laundry
Study
Laundry
Elliptical
Elliptical
Laundry
Elliptical
Elliptical
Elliptical
test
0
test
1
test
2
test
3
test
4
test
5
test
6
test
7
test
8
test
9
test
10
test
11
test
由于某些原因,分配给allTasks的最后一个对象被分配给列表中的每个索引。这适用于
此任务
的所有属性

作为参考,以下是我的任务类和get_任务类方法的外观:

class Task(object):
    def __init__(self, taskID, taskName, points, active, complete, approved, assignedUserID, createdByUserID, dateCreated, dateCompleted, frequency):
        self.taskID = taskID
        self.taskName = taskName
        self.points = points
        self.complete = complete
        self.approved = approved
        self.assignedUserID = assignedUserID
        self.createdByUserID = createdByUserID
        self.dateCreated = dateCreated
        self.dateCompleted = dateCompleted
        self.frequency = frequency
        self.homeID = homeID

    @classmethod

    def get_task(self, taskID):
        t = (taskID,)
        cur = mysql.connection.cursor()
        cur.execute("SELECT * FROM tasks WHERE taskID=%s", t)
        columns = [col[0] for col in cur.description]
        task = [dict(zip(columns, row)) for row in cur.fetchall()]
        self.taskID = taskID 
        self.taskName = task[0]['taskName']
        self.points = task[0]['points']
        self.aproved = task[0]['approved']
        self.assignedUserID = task[0]['assignedUserID']
        self.createdByUserID = task[0]['createdByUserID']
        self.dateCreated = task[0]['dateCreated']
        self.dateCompleted = task[0]['dateCompleted']
        self.frequency = task[0]['frequency']
        self.dueDate = task[0]['dueDate']
        self.homeID = task[0]['homeID']
        return self
我知道该方法工作正常,因为每次循环迭代时,
thisttask
都有正确的值。似乎
.append
不起作用,因为一旦我退出循环,
allTasks
中的值就错了

编辑:根据@barny,我为以下内容创建了一个最小的可复制示例:

import copy

# initialize Task object

class Task(object):
    def __init__(self, taskID, taskName, points, active, complete, approved, assignedUserID, createdByUserID, dateCreated, dateCompleted, frequency):
        self.taskID = taskID
        self.taskName = taskName

# define method to return values

    @classmethod

    def get_task(self, index):
        taskIDList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
        taskNames = ['Do Dishes', 'Make Bed', 'Laundry', 'Study', 'Laundry', 'Elliptical', 'Elliptical', 'Laundry', 'Elliptical', 'Elliptical', 'Elliptical', 'test']
        self.taskID = taskIDList[index]
        self.taskName = taskNames[index]
        return self

# create empty allTasks list
allTasks=[]

homeTasks = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

# create thisTask for every value of homeTasks and append to allTasks
for y in range(len(homeTasks)):
        thisTask = Task.get_task(y)
        allTasks.append(thisTask)
        print(allTasks[y].taskName)

# print task names from allTasks for testing:
for z in range(len(allTasks)):
        print(z)
        print(allTasks[z].taskName)

此外,根据反馈,我现在了解到
thisttask
是对对象的引用,而不是
get\u task
结果的新副本。为此,我尝试在
任务中使用
copy.copy()
copy.deepcopy()
。get_任务(homeTasks[y])
ThistTask
都没有用。似乎连副本都是参考资料。还有别的办法吗

编辑2:以下是我尝试使用copy和deepcopy的方法:

for y in range(len(homeTasks)):
        print(y)
        thisTask = copy.copy(Task.get_task(y))
        allTasks.append(thisTask)
        print(allTasks[y].taskName)
在每次测试后:

for z in range(len(allTasks)):
        print(z)
        print(allTasks[z].taskName)
这四种方法产生了完全相同的结果:

0
Do Dishes
1
Make Bed
2
Laundry
3
Study
4
Laundry
5
Elliptical
6
Elliptical
7
Laundry
8
Elliptical
9
Elliptical
10
Elliptical
11
test
0
test
1
test
2
test
3
test
4
test
5
test
6
test
7
test
8
test
9
test
10
test
11
test

getTask
不会在每次调用时创建新的
任务
;在使用
allTasks
的当前元素中的值对其进行修改后,它始终返回相同的
Task
。因此,您已将相同的
任务
反复添加到列表中,最后得到上次调用
getTask
的值

解决此问题的一种方法是,每次添加
时,从
此任务的当前内容创建一个新的
任务
;例如:

Task(thisTask.taskID, thisTask.taskName, 1,1,1,1,1,1,1,1,1)
或者更好的是,您可以修改
getTask
来执行此操作:

return Task( taskIDList[index], taskNames[index], 1,1,1,1,1,1,1,1,1 )

getTask
不会在每次调用时创建新的
任务
;在使用
allTasks
的当前元素中的值对其进行修改后,它始终返回相同的
Task
。因此,您已将相同的
任务
反复添加到列表中,最后得到上次调用
getTask
的值

解决此问题的一种方法是,每次添加
时,从
此任务的当前内容创建一个新的
任务
;例如:

Task(thisTask.taskID, thisTask.taskName, 1,1,1,1,1,1,1,1,1)
或者更好的是,您可以修改
getTask
来执行此操作:

return Task( taskIDList[index], taskNames[index], 1,1,1,1,1,1,1,1,1 )

那么为什么
allTasks[y]
会随着每个循环而变化呢?如果它总是添加相同的
任务
,那么它不总是第一次调用时的值吗,
allTasks[0]
?因为这是第一个循环中的最终赋值,设置了第二个循环每次迭代中显示的(单个)值。谢谢,我现在明白了。有办法解决这个问题吗?我尝试了
copy.copy()
copy.deepcopy()
复制对象并将其附加到
allTasks
,但没有成功,结果相同。您的编辑成功了,非常感谢!!那么为什么
allTasks[y]
会随着每个循环而变化呢?如果它总是添加相同的
任务
,那么它不总是第一次调用时的值吗,
allTasks[0]
?因为这是第一个循环中的最终赋值,设置了第二个循环每次迭代中显示的(单个)值。谢谢,我现在明白了。有办法解决这个问题吗?我尝试了
copy.copy()
copy.deepcopy()
复制对象并将其附加到
allTasks
,但没有成功,结果相同。您的编辑成功了,非常感谢!!请将所有相关代码(包括导入和数据)编辑为-以便任何人都可以从您的问题中复制一份并粘贴到文件中,而无需添加任何内容。运行它以查看与您输入问题相同的结果。好的,现在应该可以复制了。谢谢你让我知道。你是如何尝试制作/使用
任务的副本的?
?我刚刚编辑了我的主要帖子,并用我尝试过的4种方式粘贴了它和我得到的输出。很抱歉,以前应该这样做。请将所有相关代码(包括导入和数据)编辑到您的问题中,以便任何人都可以从您的问题中复制一个副本并粘贴到文件中,而无需添加任何内容。运行它以查看与您输入问题相同的结果。好的,现在应该可以复制了。谢谢你让我知道。你是如何尝试制作/使用
任务的副本的?
?我刚刚编辑了我的主要帖子,并用我尝试过的4种方式粘贴了它和我得到的输出。对不起,我以前应该这么做的。
return Task( taskIDList[index], taskNames[index], 1,1,1,1,1,1,1,1,1 )