如何绕过 Python 中的列表别名



这真的很烦人。我使用原始列表中的元素创建了一个子列表。然后,当我改变子列表时,原始列表也会发生变化,即使它们应该位于不同内存位置的不同对象中。

data = [['male', 'weak'], ['female', 'weak'], ['female', 'strong']]
subdata = []
for i in data:
if(i[1] == 'weak'):
subdata.append(i)
subdata[0].pop(0)
print(subdata)
print(data)

复制带有[:]的子列表:

data = [['male', 'weak'], ['female', 'weak'], ['female', 'strong']]
subdata = []
for i in data:
if(i[1] == 'weak'):
subdata.append(i[:])
subdata[0].pop(0)
print(subdata)
print(data)

输出:

[['weak'], ['female', 'weak']]
[['male', 'weak'], ['female', 'weak'], ['female', 'strong']]

您的原始输出:

['weak'], ['female', 'weak']]
[['weak'], ['female', 'weak'], ['female', 'strong']]

如果您的子列表包含更深嵌套的列表,请使用copy.deepcopy()

data = [['male', 'weak'], ['female', 'weak'], ['female', 'strong']]
subdata = []
for i in data:
if(i[1] == 'weak'):
subdata.append(copy.deepcopy(i))
subdata[0].pop(0)
print(subdata)
print(data)

输出:

[['weak'], ['female', 'weak']]
[['male', 'weak'], ['female', 'weak'], ['female', 'strong']]

最新更新