Почему поиск индекса * перед * свопом, а не встроенным изменяет результат? - PullRequest
0 голосов
/ 12 октября 2019

Рассмотрим следующий код:

data1 = [1.48,  -4.96]
data2 = [1.48,  -4.96]

# i is index we want to swap; mn is the data we want to swap the content of index-i with
i = 0; mn = data[1]

# attempt 1: prior lookup
k = data1.index(mn)
data1[i], data1[k] = data1[k], data1[i]

# attempt 2: in-line lookup
data2[i], data2[data2.index(mn)] = data2[data2.index(mn)], data2[i]

print("Prior lookup:  %r" % data1)
print("Inline lookup: %r" % data2)

Вывод:

Prior lookup:  [-4.96, 1.48]
Inline lookup: [1.48, -4.96]

Почему они не идентичны?

1 Ответ

0 голосов
/ 12 октября 2019

Давайте добавим некоторую трассировку, чтобы мы могли видеть порядок операций:

import sys

def findIdx(ary, tgt):
    retval = ary.index(tgt)
    print('First instance of %r in %r is at position %r' % (tgt, ary, retval), file=sys.stderr)
    return retval

data1 = [1.48,  -4.96]
i = 0
mn = data1[1]

k = findIdx(data1, mn)
data1[i], data1[k] = data1[k], data1[i]
print("Prior lookup:  %r" % data1)

data2 = [1.48,  -4.96]
data2[i], data2[findIdx(data2, mn)] = data2[findIdx(data2, mn)], data2[i]
print("Inline lookup: %r" % data2)

Журналы затем выясняют:

First instance of -4.96 in [1.48, -4.96] is at position 1
Prior lookup:  [-4.96, 1.48]
First instance of -4.96 in [1.48, -4.96] is at position 1
First instance of -4.96 in [-4.96, -4.96] is at position 0
Inline lookup: [1.48, -4.96]

Как видите, последний вызовпоиск индекса выполняется в отношении массива , в котором уже заменен один из двух элементов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...