Python列表追加

7

我想在Python中存储变量的中间值。这个变量在循环中更新。当我尝试使用list.append命令来实现时,它会将列表中的每个值都更新为变量的新值。我应该怎么做?

while (step < maxstep):
    for i in range(100):
        x = a*b*c
        f1 += x
    f2.append(f1)
    print f2
    raw_input('<<')
    step += 1

预期输出
[array([-2.03,-4.13])]
<<
[array([-2.03,-4.13]),array([-3.14,-5.34])]

打印输出

[array([-2.03,-4.13])]
<<
[array([-3.14,-5.34]),array([-3.14,-5.34])]

在Python中是否有获得我想要的东西的不同方式?


3
conditionm的意思是什么?fi是什么?f()是什么?condition通常指一个表达式或变量的值,用于判断程序执行哪些操作。m可能指某个数字或变量,具体取决于上下文。fi是一种编程语句,类似于if-else语句,表示如果条件为真则执行某些操作,否则执行其他操作。f()表示调用函数f,它可以是预定义的函数或用户自定义的函数,用于执行特定的任务并返回结果。 - user647772
X根据一个函数进行更新, m是for循环的范围, while循环运行任意数量的步骤。 - abcd
但是现在我有点困惑,我看到你的代码中有 f1fi,这是打错字了吗? - zenpoy
那是一个打字错误 :) 谢谢 - abcd
5个回答

9
假设原始文件有错别字,f1 实际上应该是 fi(或反之亦然): fi 是一个指向对象的指针,所以你不断地添加相同的指针。当你使用 fi += x 时,实际上改变的是 fi 指向的对象的值。
为了解决这个问题,可以改用 fi = fi + x

啊!我没意识到f1 += x和f1=f1+x之间有这么大的区别。问题解决了 :) - abcd
为下一代添加了您的解决方案。 - zenpoy

6
我猜你的意思是这样的:

我想你的意思是这样的:

   f2 = []
   f1 = 0
   for i in range(100):    
       x = f()
       f1 += x
   f2.append(f1)
   print f2

请注意,如果f1是一个可变对象,那么f1 += x这一行不会创建新的对象,而只会改变f1的值,因此f2数组中所有出现的f1都会被更新。

2

看起来您正在将相同的数组附加到列表中,然后更改数组的内容。

每次将其附加到f2时,您需要创建一个新的数组对象。


1

另一个相关的问题是“如何通过引用传递变量?”。

Daren Thomas使用赋值来解释Python中变量传递的工作原理。对于append方法,我们可以采用类似的方式思考。假设你要将列表“list_of_values”附加到列表“list_of_variables”中,

list_of_variables = []
list_of_values = [1, 2, 3]
list_of_variables.append(list_of_values)
print "List of variables after 1st append: ", list_of_variables

list_of_values.append(10)
list_of_variables.append(list_of_values)
print "List of variables after 2nd append: ", list_of_variables

追加操作可以理解为:

list_of_variables[0] = list_of_values --> [1, 2, 3]
list_of_values --> [1, 2, 3, 10]
list_of_variables[1] = list_of_values --> [1, 2, 3, 10]

由于“list_of_variables”中的第一个和第二个项目指向内存中的同一对象,因此上面的输出为:
List of variables after 1st append:  [[1, 2, 3]]
List of variables after 2nd append:  [[1, 2, 3, 10], [1, 2, 3, 10]]

另一方面,如果"list_of_values"是一个变量,行为将会不同。

list_of_variables = []
variable = 3
list_of_variables.append(variable)
print "List of variables after 1st append: ", list_of_variables

variable = 10
list_of_variables.append(variable)
print "List of variables after 2nd append: ", list_of_variables

现在的追加操作相当于:

list_of_variables[0] = variable --> 3
variable --> 4
list_of_variables[1] = variable --> 4

而输出为:

List of variables after 1st append:  [3]
List of variables after 2nd append:  [3, 10]

变量和值列表的区别在于后者是原地更改的。

1

你正在追加的对象(fi)是可变的(请参阅Python文档),这意味着你正在追加一个对该对象的引用,而不是对象值。因此,列表索引0和1实际上是同一个对象。

你需要在每个循环迭代中要么创建一个新对象(fi = array()),要么使用copy模块


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接