【问题标题】:Replacing items in list, but it is returning same value (Python)替换列表中的项目,但它返回相同的值(Python)
【发布时间】:2017-07-30 19:53:23
【问题描述】:

编辑: 这应该与我在下面的代码中所做的完全相同,但简化了。 我正在替换嵌套列表中的值。前 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']

【问题讨论】:

  • 你能把它简化一点吗?也许让代码输入/输出类似于'1''2''3'对应于你实际得到的东西?这将帮助人们回答你的问题。并不是说这是不可读的,但在写问题时绝对是要考虑的事情。
  • 这很难回答,因为我们无法重现该问题。请尝试创建一个独立的、可重复的示例和edit 问题。这样做,您很可能会自己发现问题,否则我们很乐意提供帮助。
  • 这很难回答,因为我们无法重现该问题。请尝试创建一个独立的、可重现的示例和edit 问题。这样做,您很可能会自己发现问题,否则我们很乐意提供帮助。
  • 您已将此问题标记为熊猫。您是否正在使用数据框?
  • 我猜出于某种原因self.seq_string[87]self.seq_string[116]self.seq_string[171]self.seq_string[180]self.seq_string[184] 都指向同一个列表,但是您没有显示代码它们在哪里被初始化。

标签: python


【解决方案1】:

根据@Błotosmętek 的评论,问题很可能是您只有一个列表被许多不同的子列表指向。用一些代码来解释这一点,让我们假设我有以下代码(基本上和我猜的一样):

# I create two sublists to be used when I want the same information
# in two different rows of my global list
l1 = ['A','B','C']
l2 = ['C','D','E']
# I now create a global list using my sublist
l = [l1, l1, l2, l2]

现在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 个独立列表,而不是 4 个指向 2 个物理列表的指针。

【讨论】:

  • 这一切都说得通。我正在使用 df.tolist() 修改存储的 Pandas 数据框。如果我最初分别创建它们,那么当它们从数据框中带回时,是否会将任何重复项存储为同一个对象?
  • @agudmundson 我对 Pandas 或 df.tolist() 一点也不熟悉,但我相信如果你一开始就单独创建它们,它们在存储时不会随机合并。 .但我想你应该试试看会发生什么!真的,只要您不在任何地方将现有列表分配给新变量,您就不应该有任何问题。
猜你喜欢
  • 2020-12-06
  • 2012-11-11
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多