6

我想在 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 中获得我想要的东西有不同的方法吗?

4

5 回答 5

8

假设原件有错字并且f1实际上是fi(或反之亦然):

fi是指向对象的指针,因此当fi += x您实际更改指向的对象的值时,您会不断附加相同的指针fi。希望这很清楚。

要解决此问题,您可以fi = fi + x改为。

于 2012-09-05T10:48:02.910 回答
3

我想你的意思是这样的:

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

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

于 2012-09-05T10:50:22.923 回答
2

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

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

如果您需要更多帮助,您需要在问题中的代码中添加更多信息。目前没有多大意义(fi改变的价值在哪里?)

于 2012-09-05T10:47:59.037 回答
1

你真的应该粘贴一个工作示例。

您要附加的对象 (fi) 是可变的(请参阅 Python 文档),本质上意味着您要附加对对象的引用,而不是对象值。因此,列表索引 0 和 1 实际上是同一个对象。

您需要fi = array()在每次循环迭代时创建一个新对象 () 或使用复制模块

于 2012-09-05T10:54:54.553 回答
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 appending: ", list_of_variables
list_of_values.append(10)
list_of_variables.append(list_of_values)
print "List of variables after 2nd appending: ", 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 variabiles after 1st appending:  [[1, 2, 3]]
List of variables after 2nd appending:  [[1, 2, 3, 10], [1, 2, 3, 10]]

另一方面,如果“list_of_values”是一个变量,则行为会有所不同。

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

现在的追加操作相当于:

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

输出是:

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

variable 和 list_of_values 之间的区别在于后者就地更改。

于 2016-10-09T14:21:07.367 回答