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

Python 为什么这个列表会改变值?,python,list,Python,List,我有一个名为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)

我有一个名为
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)
输出:

[[1,1,1]#术语
[1,1,2]#两个
[1,1,2]#术语

在上下文中,我试着用这个来解决这次英国信息学奥林匹克过去考试第5页上的问题:。

当你做两个。附加(一)
,你传递的是对一个列表的引用,而不是值本身。因此,当您执行
twos[-1][-1]=2
时,它将修改“一”列表本身中的值,而不是twos列表中的副本

要将值而不是引用传递到“对象”列表,可以执行以下操作:

twos.append(ones[:])
two.append(one)
不复制
one

内存中只有一个列表
ones
,也有以下引用:

  • 术语[0]
  • twos[0]
  • 还有
    terms[-1]
    twos[-1]
    ,因为
    terms
    twos
    每个只有一个元素,所以第一个是最后一个

    现在,当您变异
    one
    /
    术语[0]
    /
    术语[-1]
    /
    两个[0]
    /
    两个[-1]
    时,您正在内存中变异相同的列表

    我强烈推荐观看。

    这里:

    twos.append(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])
    

    terms.append(one)
    twos.append(one)
    ones
    中的列表添加引用,
    twos[-1][-1]=2
    对该列表进行了变异。相关:,@khelwood感谢您的回复<代码>术语包含
    术语
    一次,据我所知。我错过了什么?错了。对于这一点,您将使用Python 2。如果您刚刚开始,我建议您使用Python 3。啊,好的,谢谢。现在,我如何传递
    ones
    的值而不是引用?请尝试执行
    twos=ones[:]
    谢谢!我尝试了两个。附加(一个[:]),这似乎奏效了。我还不能给你投票,但谢谢你——我会看视频的。