Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 15, 2015 13:50:40

vananabu
Зарегистрирован: 2015-07-25
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Функция изменяет список

Помогите, пожалуйста, найти причину изменеения списка функцией. Список (matrixA) передаю в функцию delta_func в виде копии (при вычислении deltas). В конце концов matrixA все равно изменяется.

def train(matrix):
    matrixB = [30, 150, 110]
    matrixA = list(map(list, zip(*matrix))) # список списков размерностью 3 на 3 с целыми числами
#------------------------------------------------------------------------------------------------------------------------------
    def delta_func(A, B, i):
        print(id(A))
        if i:
            for index in range(3):
                A[index][i - 1] = B[index]
        plus = lambda X: X[0][0]*X[1][1]*X[2][2] + X[0][1]*X[1][2]*X[2][0] + X[0][2]*X[1][0]*X[2][1]
        return plus(A) - plus([item[::-1] for item in A])
#------------------------------------------------------------------------------------------------------------------------------
    delta = delta_func(matrixA, matrixB, 0)
    deltas = [int(delta_func(matrixA[:], matrixB, i) / delta) for i in range(1, 4)]
#------------------------------------------------------------------------------------------------------------------------------
    check = lambda x: [360, -360][bool(x)]
    return [i + check(i) if abs(i) > 180 else i for i in (item % check(item) for item in deltas)]

Отредактировано vananabu (Окт. 15, 2015 13:53:24)

Офлайн

#2 Окт. 15, 2015 14:05:55

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Функция изменяет список

vananabu
delta_func(matrixA[:], matrixB, i)
Это не копия элементов матрицы, а копия указателей на одни и те же строки в ней.
>>> lst = [[1], [2], [3]]
>>> 
>>> tmp = lst[:]
>>> tmp[0][0] = 0
>>> lst
[[0], [2], [3]]
>>> tmp
[[0], [2], [3]]
>>>



Отредактировано py.user.next (Окт. 15, 2015 14:06:35)

Офлайн

#3 Окт. 15, 2015 14:19:21

vananabu
Зарегистрирован: 2015-07-25
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Функция изменяет список

py.user.next
спасибо. действительно это поверхностная копия списка.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version