为什么这个列表会改变价值?

时间:2018-01-02 13:43:23

标签: python list

我有一个名为list的{​​{1}},它会在不应影响它的代码块之后更改值。为什么呢?

ones

输出:

s = 3

ones = []
terms = []
for i in range (0, s):
    ones.append(1)
terms.append(ones)
print(terms)

twos = []
if len(ones) > 1:
    twos.append(ones)
    twos[-1].pop()
    twos[-1][-1] = 2
    print(twos)

print(terms)

对于上下文,我正在尝试使用它来开始解决此英国信息学奥林匹克过去考试第5页的问题:http://www.olympiad.org.uk/papers/2009/bio/bio09-exam.pdf

3 个答案:

答案 0 :(得分:3)

twos.append(ones)不会复制ones

内存中只有一个列表ones,其中也包含以下参考:

  1. terms[0]
  2. twos[0]
  3. 以及terms[-1]twos[-1]因为termstwos每个只有一个元素,所以第一个是最后一个元素。

    现在,当您变异 ones / terms[0] / terms[-1] / twos[0] / twos[-1]时,您正在改变相同的列表在记忆中。

    我强烈建议您观看Facts and Myths about Python names and values

答案 1 :(得分:3)

下面:

twos.append(ones)

您要将{strong>引用附加到ones,而不是其值。看到差异:

In [1]: l1 = [1, 2, 3]

In [2]: l2 = []

In [3]: l2.append(l1)

In [4]: l2, l1
Out[4]: ([[1, 2, 3]], [1, 2, 3])

In [5]: l2[0][1] = 'test'

In [6]: l2, l1
Out[6]: ([[1, 'test', 3]], [1, 'test', 3])

为了避免这种情况,您可以使用[:]运算符来提供副本:

In [7]: l1 = [1, 2, 3]

In [8]: l2 = []

In [9]: l2.append(l1[:])

In [10]: l2, l1
Out[10]: ([[1, 2, 3]], [1, 2, 3])

In [11]: l2[0][1] = 'test'

In [12]: l2, l1
Out[12]: ([[1, 'test', 3]], [1, 2, 3])

答案 2 :(得分:1)

执行twos.append(ones)时,您将引用传递给那些列表,而不是值本身。因此,当您执行twos[-1][-1] = 2时,它会修改单个列表本身中的值,而不是两个列表中的副本。

要将值而不是引用传递给列表,您可以执行以下操作:

twos.append(ones[:])