我创建了一个循环,创建变量并将它们附加到列表中的函数。
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个属性,DN
和GN
。
这些属性具有以下结构:0000213123XX,其中XX是两位数字。
需要做的是生成XX的值,范围在00到99之间,因此属性将为:000021312300,000021312301,...每次我将RECORD
附加到列表RECORD
时DN
和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 ...
有人可以向我解释原因吗?我该如何解决这个问题?
答案 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
。