Python:列表破坏分配错误

时间:2017-06-25 03:41:33

标签: python numpy

在以下代码中,我想按def中的元素对列表abc进行排序。但是,结果def具有重复值,这不应该发生,因为这只是一个排序。 我发现问题出现了(让我们称之为电子线。)

[ad[i], be[i], cf[i]] = [m, n, o]

在此行之前,即行的结果(让我们称之为c-line。)

m, n, o = sorted([ad[i], be[i], cf[i]], key=itemgetter(0))

是正确的,但当它进入电子线路时,问题就出现了。我在{E-line:

之前的i = 1时捕获了屏幕截图

before

和电子线后面的截图:

after

请参阅?不仅ad[1]cf[1]重复,而且mo在步骤之后也是相同的。 你能告诉我这一步发生了什么吗?为什么分配会产生重复的值?

import numpy as np
from operator import itemgetter

a = [0.06546757, 0.98135887, 0.94941228]
b = [0.41770855, 0.7188204, 0.4161441]
c = [0.64173702, 0.71125552, 0.11180992]
d = [0.29584944, 0.23759218, 0.89771063]
e = [0.97220382, 0.06904977, 0.81744618]
f = [0.10343642, 0.05042443, 0.56769208]

# Group a and d, b and e, c and f
ad = np.transpose([a, d])
be = np.transpose([b, e])
cf = np.transpose([c, f])

for i in range(3):
    m, n, o = sorted([ad[i], be[i], cf[i]], key=itemgetter(0))  # Sort by element in a, b, c
    [ad[i], be[i], cf[i]] = [m, n, o]

1 个答案:

答案 0 :(得分:0)

如果我指定m,n,o的副本,则复制消失(我认为):

print(ad, be, cf)
for i in range(3):
    m, n, o = sorted([ad[i], be[i], cf[i]], key=itemgetter(0))  # Sort by element in a, b, c
    [ad[i], be[i], cf[i]] = [m.copy(), n.copy(), o.copy()]
print()
print(ad, be, cf)
# print(m,n,o)

产生

[[ 0.06546757  0.29584944]
 [ 0.71125552  0.05042443]
 [ 0.11180992  0.56769208]] 

[[ 0.41770855  0.97220382]
 [ 0.7188204   0.06904977]
 [ 0.4161441   0.81744618]] 

[[ 0.64173702  0.10343642]
 [ 0.98135887  0.23759218]
 [ 0.94941228  0.89771063]]

您的示例可能更简单,更易于阅读。例如,使用整数而不是浮点数。

我没有详细说明这一点,但重复表明一个或多个值正在被写入。 m,n,o是2个元素列表。所以我猜测这将是放置copy的好地方。