Сохранение вывода из функции Python необходимо несмотря на то, что не используется вывод

Я пытаюсь понять, почему я должен хранить выходные данные функции Python (независимо от имени переменной, которую я использую, и независимо от того, буду ли я впоследствии использовать эту переменную). Я думаю, что это более общее для Python, а не специально для программного обеспечения NEURON, поэтому я поместил его здесь, на Stackru.

Интересная линия здесь:

clamp_output = attach_current_clamp(cell)

Если я просто напишу attach_current_clamp(cell) без сохранения вывода функции в переменную, код не работает (участок пуст), и все же я не использую clamp_output совсем. Почему я не могу просто вызвать функцию? Почему я должен использовать переменную для хранения вывода, даже не используя вывод?

import sys
import numpy
sys.path.append('/Applications/NEURON-7.4/nrn/lib/python')
from neuron import h, gui
from matplotlib import pyplot

#SET UP CELL
class SingleCell(object):
    def __init__(self):
        self.soma = h.Section(name='soma', cell=self)
        self.soma.L = self.soma.diam = 12.6517
        self.all = h.SectionList()
        self.all.wholetree(sec=self.soma)
        self.soma.insert('pas')
        self.soma.e_pas = -65

        for sec in self.all:
            sec.cm = 20
#CURRENT CLAMP
def attach_current_clamp(cell):
    stim = h.IClamp(cell.soma(1))
    stim.delay = 100
    stim.dur = 300
    stim.amp = 0.2
    return stim

cell = SingleCell()

#IF I CALL THIS FUNCTION WITHOUT STORING THE OUTPUT, THEN IT DOES NOT WORK
clamp_output = attach_current_clamp(cell)

#RECORD AND PLOT
soma_v_vec = h.Vector()
t_vec = h.Vector()
soma_v_vec.record(cell.soma(0.5)._ref_v)
t_vec.record(h._ref_t)
h.tstop = 800
h.run()
pyplot.figure(figsize=(8,4))
soma_plot = pyplot.plot(t_vec,soma_v_vec)
pyplot.show()

1 ответ

Решение

По моему опыту, это специфическая ошибка NEURON-Python /"функция". Я подозреваю, что это связано с сборкой мусора в Python и тем, как NEURON реализует интерфейс Python-HOC. Если ссылка на IClamp собирается мусором, IClamp также удаляется из NEURON.

Сохранение IClamp как свойства ячейки предотвращает проблему так же, как и сохранение результата, так что это может быть вариантом для вас:

# In __init__:
self.IClamps = []

# In attach_current_clamp:
stim.amp = 0.2
cell.IClamps.append(stim)
#return stim
Другие вопросы по тегам