1

我有 10 个元素的列表,其中包含 2 个元素的元组,我想为每个元组添加一个值,但是当我编写以下代码时,似乎计算了累积总和。这是怎么回事。请帮忙

# -*- coding: utf-8 -*-
i=0
k=10
count=[]
value=[1,2]
while i < k:
  count.append(value)
  i=i+1
t=[10,2]
i=0
#for item in count:
  #print item
while i <(len(count)):
  count[i][0]+=t[0];
  count[i][1]+=t[1];
  i+=1;

for item in count:
  print item

outpus 即将出现

[101, 22]
[101, 22]
[101, 22]
[101, 22]
[101, 22]
[101, 22]
[101, 22]
[101, 22]
[101, 22]
[101, 22]

正如我所期望的那样

[11, 4]
[11, 4]
[11, 4]
[11, 4]
[11, 4]
[11, 4]
[11, 4]
[11, 4]
[11, 4]
[11, 4]
4

3 回答 3

3

那是因为您实际上有一个包含十个对相同(单个)2 项列表的引用的列表。您在第二个循环中重复添加到同一个列表。你真的想要一个子列表的新实例(你真正拥有的是一个可变列表,而不是一个元组)。

你可以这样做:

while i < k:
  count.append(value[:])
  i=i+1

获取嵌入列表的新副本。

于 2012-05-05T04:35:09.873 回答
2

尝试这个:

i=0
k=10
count=[]

while i < k:
  count.append([1,2])
  i=i+1

t=[10,2]
i=0

while i <(len(count)):
  count[i][0]+=t[0];
  count[i][1]+=t[1];
  i+=1;

for item in count:
  print item

问题出在这一行:count.append(value),您正在向列表添加相同可变引用,并一遍又一遍地更新它。[1, 2]count

通过用您替换该行,count.append([1,2])确保每次添加一个新的、不同的列表。

顺便说一句,您没有在代码中的任何地方使用元组(如问题中所述),而只是列表。

于 2012-05-05T04:28:23.963 回答
0

问题在于python如何使用内存,每次将值附加到计数时,实际上都是在附加对值的内存位置的引用。发生的事情是 t[0] 每次循环时都会被添加到 value[0] 中。请参阅下面的操作(与您使用的设置相同)

n [54]: for i, item in enumerate(count):
print count[i];
count[i][0] += t[0]
print count[i]
....:     
[1, 2]
[11, 2]
[11, 2]
[21, 2]
[21, 2]
[31, 2]
[31, 2]
[41, 2]
[41, 2]
[51, 2]
[51, 2]
[61, 2]
[61, 2]
[71, 2]
[71, 2]
[81, 2]
[81, 2]
[91, 2]
[91, 2]
[101, 2]

相反,您想要的输出仅附加列表对象本身 [1,2] 而不将其分配给变量。

此外, enumerate() (python 内置)在循环中生成索引号和项目,因此您不必在任何地方都使用 while。

于 2012-05-05T04:44:05.760 回答