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[:]
谢谢!我尝试了两个。附加(一个[:]),这似乎奏效了。我还不能给你投票,但谢谢你——我会看视频的。