Как поменять местами две локальные переменные внутри функции в Python - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь поменять местными переменными внутри функции, чтобы повернуть матрицу 2 на 2 на 90 градусов.

def twobytwo(m):
    last = len(m)-1
    for i in range(0, last):
        swap(m[i][i], m[i][last])
        swap(m[i][i], m[last][last])
        swap(m[i][i], m[last][i])
    return m


def swap(i, j):
    temp = i
    i = j
    j = temp

print(twobytwo([[0, 1], [2, 3]]))

В настоящее время мне возвращена исходная матрица, но я хочу увидеть

[[2,0],[3,1]]

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Предполагается, что параметры swap () изменены на месте (т.е. передача по ссылке). Python не делает этого в вашем коде: когда вы вызываете что-то вроде swap (m [i] [i], m [i] [last]), он разыменовывает значения m и вызывает swap (0,1). Так что swap () изменяет только i, j; он не изменяет вашу «матрицу» (технически это список списков).

Попробуйте переписать функцию swap (), чтобы взять "матрицу" плюс две пары индексов: (i, j) и (k, l).

0 голосов
/ 18 января 2019

Я думаю, что это то, чего вы хотите достичь:

def twobytwo(m):
    last = len(m)-1
    for i in range(0, last):
        m[i][i], m[i][last] = m[i][last], m[i][i]
        m[i][i], m[last][last] = m[last][last], m[i][i]
        m[i][i], m[last][i] = m[last][i], m[i][i]
    return m

print(twobytwo([[0, 1], [2, 3]]))

РЕДАКТИРОВАТЬ: Если вы все еще хотите сохранить функцию swap:

def swap(i, j):
    return j, i

a, b = swap(a, b)

Но я думаю a, b = b, a достаточно хорош.

...