替换列表中的项,但返回相同的值(Python)

替换列表中的项,但返回相同的值(Python),python,Python,编辑: 这应该与我在下面的代码中所做的完全相同,但简化了。 我正在替换嵌套列表中的值。前3个值正确更改,但最后3个值替换为相同的值。如果我运行这个简化的代码,它将正确输出。。我看不出这与底部的实际代码有什么不同 string = [['A', 'B', 'C'], ['A', 'B', 'C'], ['A', 'B', 'C'], ['D', 'E', 'F'], ['D', 'E', 'F'], ['D'

编辑: 这应该与我在下面的代码中所做的完全相同,但简化了。 我正在替换嵌套列表中的值。前3个值正确更改,但最后3个值替换为相同的值。如果我运行这个简化的代码,它将正确输出。。我看不出这与底部的实际代码有什么不同

string = [['A', 'B', 'C'],
         ['A', 'B', 'C'],
         ['A', 'B', 'C'],
         ['D', 'E', 'F'],
         ['D', 'E', 'F'],
         ['D', 'E', 'F']]

string[0][2] = 'X'
string[1][2] = 'Y'
string[2][2] = 'Z'
string[3][2] = 'X'
string[4][2] = 'Y'
string[5][2] = 'Z'

for i in string:
    print(i)
['A','B','X']

['A','B','Y']

['A','B','Z']

[D',E',Z']

[D',E',Z']

['D','E','Z']

有人能告诉我这里出了什么问题吗?我正在替换下面列表中的字符串值。在前5次更改中,一切正常。。。但是,我的最后5个值都被相同的值替换

self.seq_string[67][1] = 'Sequence_Images/40_1.jpg'
self.seq_string[106][2] = 'Sequence_Images/39_6.jpg'
self.seq_string[131][1] = 'Sequence_Images/38_6.jpg'
self.seq_string[175][1] = 'Sequence_Images/37_5.jpg'
self.seq_string[177][2] = 'Sequence_Images/1_2.jpg'

self.seq_string[87][2] = 'Sequence_Images/40_1.jpg'
self.seq_string[116][2] = 'Sequence_Images/39_6.jpg'
self.seq_string[171][2] = 'Sequence_Images/38_6.jpg'
self.seq_string[180][2] = 'Sequence_Images/37_5.jpg'
self.seq_string[184][2] = 'Sequence_Images/1_2.jpg'

print(self.seq_string[67])
print(self.seq_string[106])
print(self.seq_string[131])
print(self.seq_string[175])
print(self.seq_string[177])
print('\n')

print(self.seq_string[87])
print(self.seq_string[116])
print(self.seq_string[171])
print(self.seq_string[180])
print(self.seq_string[184])
此列表中第一个更改的值很好:

['Sequence_Images/16_3.jpg','Sequence_Images/40_1.jpg'] ['Sequence_Images/33_2.jpg'、'Sequence_Images/9_4.jpg'、'Sequence_Images/39_6.jpg'] ['Sequence_Images/16_3.jpg','Sequence_Images/38_6.jpg'] ['Sequence_Images/33_2.jpg','Sequence_Images/37_5.jpg'] ['Sequence_Images/33_2.jpg'、'Sequence_Images/9_4.jpg'、'Sequence_Images/1_2.jpg']

…但这些都用相同的值替换它。第一个项目都是相同的,这没关系——我只替换每个项目上的最后一个值:

['Sequence_Images/16_3.jpg'、'Sequence_Images/35_5.jpg'、'Sequence_Images/1_2.jpg'] ['Sequence_Images/16_3.jpg'、'Sequence_Images/35_5.jpg'、'Sequence_Images/1_2.jpg'] ['Sequence_Images/16_3.jpg'、'Sequence_Images/35_5.jpg'、'Sequence_Images/1_2.jpg'] ['Sequence_Images/16_3.jpg'、'Sequence_Images/35_5.jpg'、'Sequence_Images/1_2.jpg'] ['Sequence_Images/16_3.jpg'、'Sequence_Images/35_5.jpg'、'Sequence_Images/1_2.jpg']


在@Błotosmętek的评论之后,问题很可能是您只有一个列表,许多不同的子列表都指向了这个列表。通过一些代码来解释这一点,让我们假设我有以下代码(我猜基本上与您的代码相同):

现在
l[0]
l[1]
都指向完全相同的对象
l1
。当您访问
l[0]
并进行一些更改时,Python实际上使用它作为指向物理列表
l1
的指针,并在那里进行更改;因此,当您想要访问
l[1]
时,您将看到您在
l[0]
上所做的更改

这是因为Python不喜欢在没有必要的情况下浪费时间将一个完整的海量列表复制到一个新变量中。如果希望Python在新变量中实际复制列表,而不是创建指向列表的指针,则需要使用
copy.deepcopy
,显式执行复制:

import copy
l = [copy.deepcopy(l1),
     copy.deepcopy(l1),
     copy.deepcopy(l2),
     copy.deepcopy(l2)]

现在,您的列表
l
包含4个独立列表,而不是指向2个物理列表的4个指针。

您能简化一下吗?也许将代码输入/输出设置为类似于“1”“2”“3”的形式,与实际得到的内容相对应?这将帮助人们回答你的问题。并不是说这是不可读的,但在写问题时肯定要考虑。这是很难回答的,因为我们不能重现这个问题。请尝试创建一个独立的、可复制的示例和问题。在这样做的过程中,你很可能会自己发现问题,但除此之外,我们很乐意提供帮助。这很难回答,因为我们无法重现问题。请尝试创建一个独立的、可复制的示例和问题。在这样做的过程中,您很可能会自己发现问题,但除此之外,我们将乐于提供帮助。您已将此问题标记为熊猫。您可能正在使用数据帧吗?我猜出于某种原因,
self.seq\u字符串[87]
self.seq\u字符串[116]
self.seq\u字符串[171]
self.seq\u字符串[180]
self.seq\u字符串[184]
都指向同一个列表,但是您还没有显示初始化它们的代码位。这一切都是有意义的。我正在使用df.tolist()重写存储的数据帧。如果我最初单独创建它们,那么当它们从数据帧中带回来时,是否会将任何副本存储为同一对象?@agudmundson我对Pandas或
df.tolist()
,一点也不熟悉,但我相信如果你一开始单独创建它们,它们在存储时不会随机合并。。。但我想你应该试试看会发生什么!实际上,只要不将现有列表分配给任何地方的新变量,就不会有任何问题。
import copy
l = [copy.deepcopy(l1),
     copy.deepcopy(l1),
     copy.deepcopy(l2),
     copy.deepcopy(l2)]