【问题标题】:Appending modified object to list in for loop -- only last modification is stored将修改后的对象附加到 for 循环中的列表 - 仅存储最后一次修改
【发布时间】:2015-04-23 06:02:24
【问题描述】:

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

    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 的对象,它有两个属性DNGN。 这些属性具有以下结构:0000213123XX,其中 XX 是两位数。 需要做的是为 XX 生成 00 到 99 之间的值,因此属性将是:000021312300、000021312301、... GN 更改范围。 正如我稍后解释的那样,在循环过程中会找到数字,但是一旦循环完成,列表中的所有对象都会成为最后一个找到的对象。

那么列表中返回的所有值都是:

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 ...

谁能给我解释一下为什么?我该如何解决?

【问题讨论】:

  • 变量名不要全部大写。
  • 你还有一堆未定义的变量(或至少 TEMP_LIST_RECORDS)......但猜测 RECORD 是一个可变数据类型,你正在改变它......
  • 问题是你不断将 same RECORD 附加到 TEMP_LIST_RECORDSTEMP_LIST_RECORDS.append(RECORD) 语句,所以列表中只是一堆对给出了最后一个值RECORD。您需要在循环的每次迭代中创建一个新的并附加一个新的RECORD
  • 抱歉我的问题不清楚,我确实发布了更新,希望有人能给我一个解决方案:)
  • 这就是您的解决方案。 @martineau 给了你。

标签: python list variables for-loop


【解决方案1】:

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

这可以通过对您的代码进行一行更改来解决。您所要做的就是在循环的每次迭代中重新初始化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 替换为对适当类的调用。

【讨论】:

  • 伙计,非常感谢,我现在明白了。我一直在传递引用同一记录的地址。
猜你喜欢
  • 2018-05-11
  • 2017-10-24
  • 2019-05-15
  • 2021-12-05
  • 2015-01-03
  • 2018-12-17
  • 2022-01-25
  • 2019-07-08
  • 2018-08-10
相关资源
最近更新 更多