为什么Python while循环重置局部变量计数器?

时间:2017-06-23 10:13:10

标签: python json python-2.7 python-3.x dictionary

它总是返回我重复的值示例:

{
    "0": [4886, 7051, 9612, 9613, 4895],
    "1": [4886, 7051, 9612, 9613, 4895],
    "2": [4886, 7051, 9612, 9613, 4895],
    "3": [4886, 7051, 9612, 9613, 4895],
    "4": [4886, 7051, 9612, 9613, 4895]
}

我不知道为什么计数器在嵌套循环结束时重置。它应该在每个批次中添加下一个产品,而不是从头开始。请告诉我如何解决它?谢谢!

counter = 0
max_number = 4
batches = {}
batch = [] 
batch_counter = 0
while batch_counter <= max_number:
    while counter <= max_number:
        batch.append(data[counter])
        counter = counter+1

    batches[batch_counter] = batch
    batch_counter = batch_counter+1

batches = json.dumps(batches)
return HttpResponse(batches)

3 个答案:

答案 0 :(得分:3)

在内循环中设置batch变量后,您没有重置它。

while batch_counter <= max_number:
    batch = []
    while counter <= max_number:
        ...

在您的代码中,您使用列表初始化批次一次。相同的列表用于添加元素batch.append(data[counter])。每次使用batches[batch_counter] = batch时都会添加此列表。

答案 1 :(得分:2)

这不起作用的原因是因为 batch在第一次迭代之后仍然是列表。构建完第一个batch列表后,counter未再次设置为0。因此,内部while循环永远不会再次执行。这不是Python的问题,因为您从未指示Python删除batch列表。因此,它将简单地采用旧的,并在第二次,第三次等迭代中添加一次。

您可以通过counter设置为0并再次使batch成为新的空列表来解决问题,例如:

counter = 0
max_number = 4
batches = {}
batch = [] 
batch_counter = 0
while batch_counter <= max_number:
    counter = 0
    batch = []
    while counter <= max_number:
        batch.append(data[counter])
        counter = counter+1

    batches[batch_counter] = batch
    batch_counter = batch_counter+1

batches = json.dumps(batches)
return HttpResponse(batches)

然而,你可以让事情变得更优雅:

max_number1 = max_number+1
batch = {i : data[max_number1*i:max_number1*(i+1)] for i in range(max_number1)}
batches = json.dumps(batches)
return HttpResponse(batches)

替换整个代码片段。

答案 2 :(得分:0)

因为你的计数器到达max_number(内部循环),这就是为什么内循环只执行一次,在跳过内部循环后你设置相同的批处理&#39;在&#39;批次&#39;。