2013-08-01 3 views
-1

Так что это, наверное, глупый вопрос, но мне сложно говорить, поэтому это очень сложно для Google. Как работает ссылка python? В частности, я работал над изучением backpropagation в нейронных сетях, и, поскольку я делал простую тестовую сеть, у меня была проблема. Вот код для запуска:Ссылка на переменную Python

out = self.nodes[-1] 
for i in range(len(self.nodes)): 
for j in range(len(self.nodes[i])): 
    self.nodes[i][j]=0.0 
return out 

Если я запускаю его, как это он возвращает 0.0 каждый раз, но это будет точно получится число, если я закомментировать сброс. Как я могу получить ссылку на значение, а не переменную?

+0

Что должен делать ваш код? – Simone

+0

Почему бы просто не вернуть self.nodes [-1]? – doctorlove

+2

Я подозреваю, что вы создали список списков без создания нового значения для каждого вложенного списка; классическая ошибка начинающего Питона. Как создается 'self.nodes'? –

ответ

2

Если вы хотите out для хранения значений последнего списка/кортежа в nodes без них получать возврат к 0.0 вам необходимо либо создать копию этого объекта (nodes[-1]) или вручную скопировать их в новый список/объект кортежа , если я правильно вас понимаю, и это ваша цель. В настоящее время вы просто создаете ссылку на узлы [-1], прежде чем переходить через двумерный массив и сбросьте все значения до 0.0, что означает, что out по-прежнему будет ссылаться на референт в памяти, который вы сбросили до 0.0 значений.

out = nodes[-1].copy() # This is the list/tuple with the (non-reset) values that you want to return 
... # iterate through the array here and reset 
return out 

Это теперь будет возвращать копию (т.е. новую ссылку на новый, уникальный референта в памяти) последнего элемента nodes с государством он был при создании копии (до итерация сброса).

Не уверен, что я правильно понял вас, но забыл, что списки и кортежи - это объекты в Python и вести себя как таковые, это непростая ошибка.

Это означает, что: l0 = [0, 1] l1 = l0 l2 = l0.copy() l0.append (2)

print(l0) # prints [0, 1, 2] 
print(l1) # prints [0, 1, 2] 
print(l2) # prints [0, 1] 

l0 и l1 две ссылки на то же самое объект/референт в памяти. Через операцию copy()l2 становится ссылкой на уникальный и не идентичный референт в памяти.

Дополнение: Обратите внимание: list.copy() является, как указано в комментариях, доступным только в Python 3 и возвращает мелкую копию. Используйте copy.copy()/copy.deepcopy(), чтобы создать мелкую/глубокую копию соответственно; этот модуль доступен в Python 2 и Python 3. В качестве альтернативы, мелкой копия списка может быть получена через list(list_to_copy).

Документация здесь:

+1

Обратите внимание, что метод 'list.copy' был добавлен в Python 3. –

+0

Спасибо @JanneKarila, добавил вашу информацию и расширил ее. – bossi

+1

Простым способом копирования списка является «list (nodes)». Также я бы просто отказался от того, что у Python нет понятия «примитивы»; каждое значение является объектом, и все. – Kos

1

Вы должны копию последней строки, а не просто ссылаться на него:

out = self.nodes[-1][:] 

Списки изменчивы; в основном упорядоченный контейнер ссылок на другие объекты python, которые позволяют добавлять, удалять и изменять ссылки. Изменив все значения в списке, вы получите , перевязав эти ссылки внутри списка.

self.nodes[-1] - это просто ссылка на этот список ссылок. Вы не копировали эти ссылки; вы просто скопировали ссылку на контейнер.

Вы могли просто заменить матрицу снова:

height, width = len(self.nodes), len(self.nodes[0]) 
self.nodes = [[0.0 for _ in range(width)] for _ in range(height)] 

Теперь вы Пересвяжите nodes и создавать новые вложенные списки, так self.nodes[-1] до этого код будет ссылаться на старой последней строки.

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