列表修改如何在python中工作

时间:2012-05-05 04:21:58

标签: python list

我有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]

3 个答案:

答案 0 :(得分:3)

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

你可以这样做:

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

获取嵌入列表的新副本。

答案 1 :(得分: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])替换该行,确保每次添加新的不同列表。

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

答案 2 :(得分:0)

问题在于python如何使用内存,每次将值附加到count时,实际上是在追加对value的内存位置的引用。发生的是每次循环时t [0]被添加到值[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。