将修改后的对象附加到for循环列表中 - 仅存储最后修改

时间:2015-04-22 18:58:59

标签: python list variables for-loop

我创建了一个循环,创建变量并将它们附加到列表中的函数。

    def function(self,RECORD):
        TEMP_LIST_RECORDS=[]
        #Depends the number of X, we got 10, 100,1000,10000 LOOPS
        LOOPS=int(math.pow(10,X_RANGE))
        DIGITS="%0"+str(X_RANGE)+"d"

        #Then we create the records and we add to the MYSQL data query
        for x in range (0,LOOPS):

            END_OF_NUMBER=DIGITS%x
            RECORD.DN=DN_NUMBER+str(END_OF_NUMBER)
            RECORD.GN=GN_NUMBER+str(END_OF_NUMBER)

            TEMP_LIST_RECORDS.append(RECORD)

        return TEMP_LIST_RECORDS

说明: 我传递了一个名为RECORD的对象,它有2个属性,DNGN。 这些属性具有以下结构:0000213123XX,其中XX是两位数字。 需要做的是生成XX的值,范围在00到99之间,因此属性将为:000021312300,000021312301,...每次我将RECORD附加到列表RECORDDNGN范围发生变化。 正如我稍后解释的那样,在循环期间,找到了数字,但是一旦循环完成,列表中的所有对象都将成为最后找到的对象。

然后列表中返回的所有值都是:

000021312399
000021312399
000021312399
000021312399
000021312399
000021312399
000021312399
000021312399

但是,如果我在循环中放置一个打印件:

def function(self,RECORD):
        TEMP_LIST_RECORDS=[]
        #Depends the number of X, we got 10, 100,1000,10000 LOOPS
        LOOPS=int(math.pow(10,X_RANGE))
        DIGITS="%0"+str(X_RANGE)+"d"

        #Then we create the records and we add to the MYSQL data query
        count=0
        for x in range (0,LOOPS):

            END_OF_NUMBER=DIGITS%x
            RECORD.DN=DN_NUMBER+str(END_OF_NUMBER)
            RECORD.GN=GN_NUMBER+str(END_OF_NUMBER)

            TEMP_LIST_RECORDS.append(RECORD)
            print TEMP_LIST_RECORDS[count].DN
            count+=1

        return TEMP_LIST_RECORDS

印刷品的结果是:

000021312300
000021312301
000021312302
000021312303
000021312304
000021312305
000021312306
000021312307
...

有人可以向我解释原因吗?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

正如@martineau所评论的那样,您的问题是您已经向TEMP_LIST_RECORDS添加了一堆对同一对象RECORD的引用。因此,当循环结束时,列表的内容都是相同的。

可以通过对代码进行单行更改来解决此问题。您所要做的就是在循环的每次迭代中重新初始化RECORD(因此每个循环都有一个单独的实例):

def function(self,RECORD):
    TEMP_LIST_RECORDS=[]
    #Depends the number of X, we got 10, 100,1000,10000 LOOPS
    LOOPS=int(math.pow(10,X_RANGE))
    DIGITS="%0"+str(X_RANGE)+"d"

    #Then we create the records and we add to the MYSQL data query
    for x in range (0,LOOPS):

        RECORD = GET_NEW_RECORD()  # THIS IS THE CHANGE.

        END_OF_NUMBER=DIGITS%x
        RECORD.DN=DN_NUMBER+str(END_OF_NUMBER)
        RECORD.GN=GN_NUMBER+str(END_OF_NUMBER)

        TEMP_LIST_RECORDS.append(RECORD)

    return TEMP_LIST_RECORDS

当然,请通过调用相应的类来替换GET_NEW_RECORD