2017-06-23 74 views
2

我想了解爲什麼我必須存儲Python函數的輸出(不管我使用的變量的名稱是什麼,而不管我是否隨後使用該變量)。我認爲這對Python更通用,而不是專門用於軟件NEURON,因此我將它放在Stackoverflow上。儘管沒有使用輸出,仍然需要Python函數存儲輸出

關注的線是在這裏:

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特定的bug /「功能」。我懷疑它與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 
+0

你能夠使外部的可重複的例子神經元?或者它似乎是神經元特有的? – CodeGuy

+0

不知道我是否理解。該問題特定於實現NEURON HOC和Python之間接口的Python包「神經元」。你不需要在普通的Python中保存引用(即在神經元之外)。 – Justas

+0

謝謝。那是我的問題。 – CodeGuy