2013-08-08 2 views
1

У меня есть эта функция, которая должна транспонировать список, который он получает. Это работает, но по какой-то причине оно также изменяет исходную матрицу: почему?Пользовательский перенос списка беспорядок вверх по исходной переменной в Python

Matrix = [["1"], ["1","2"], ["1","2","3","4"], []] 

def test(): 
    global Matrix # same happens when global or not 
    tMatrix = Matrix 
    print(tMatrix) # 1 
    tMatrix = transposer(Matrix) 
    print(tMatrix) # 2 
    print(Matrix) # 3 

Выход:

[['1'], ['1', '2'], ['1', '2', '3', '4'], []] # 1 
[['1', '1', '1'], ['2', '2'], ['3'], ['4']]  # 2 
[[], [], [], []]        # 3 

Я думаю, что это не имеет значения, а вот функция ретранслятор:

def transposer(m): 
    tm = [] 
    maxi = 0 
    for i in range(0, len(m)): 
     maxi = max(maxi, len(m[i])) 
    for z in range(0, maxi): 
     row = [] 
     for j in range(0, len(m)): 
      try: 
       row.append(m[j].pop(0)) 
      except: 
       pass 
     tm.append(row) 
    return(tm) 

Как это возможно, что переменная матрица также влияет даже если функция не вызывается для этой переменной?

ответ

1

Когда вы

tMatrix = Matrix

в действительности вы делаете tMatrix ссылки на оригинальный Matrix объекта. Итак, когда вы назначаете вывод функции transposer обратно на tMatrix, вы действительно меняете исходный объект Matrix. Это очень распространенное недоразумение, когда вы привыкаете к python, например, вы можете увидеть here (ответ тоже стоит прочитать).

Попытка прочитать что-то на пути Python обрабатывает задания, и вы увидите отличие от других языков:

http://learnpython.pbworks.com/w/page/15956522/Assignment

http://anh.cs.luc.edu/python/hands-on/3.1/handsonHtml/variables.html

EDIT:

Чтобы решить проблемы, вы можете сделать копию исходного объекта, переданного transpose, через copy operation:

def transposer(n): 
    m = copy.copy(n) 
    tm = [] 
    maxi = 0 
    for i in range(0, len(m)): 
     maxi = max(maxi, len(m[i])) 
     print i, maxi 
    for z in range(0, maxi): 
     row = [] 
     for j in range(0, len(m)): 
      try: 
       row.append(m[j].pop(0)) 
      except: 
       pass 
     tm.append(row) 
    return(tm) 

Как и в случае с сайтом, вы обрабатываете свои элементы как строки. Если они должны были быть числовыми, вы можете просто ввести их без " ". Кроме того, если вам не нужно использовать собственный алгоритм транспонирования, вы можете просто использовать пакет NumPy, который уже делает matrix transposition.

+0

Возможно, у вас есть решение для чего? Я понимаю, что это ссылка, как я видел на C++, но там есть возможность ссылаться на привязку. – PascalVKooten

+0

Я их читал, но теперь я понятия не имею, как идти вперед. – PascalVKooten

+0

Проблема заключается в функции транспонирования. Когда вы выполняете 'm [j] .pop (0)', вы удаляете элементы из исходной 'Matrix', которая была передана через' m'. Я редактирую свой ответ, чтобы все было правильно. – Claudio

Смежные вопросы