我被一个像
这样的简单增量函数所困扰from numpy import *
from pylab import *
## setup parameters and state variables
T = 1000 # total time to simulate (msec)
dt = 1 # simulation time step (msec)
time = arange(0, T+dt, dt) # time array
Vr = -70 #reset
El = -70
## LIF properties
Vm = zeros(len(time)) # potential (V) trace over time
Rm = 10 # resistance (mOhm)
tau_m = 10 # time constant (msec)
Vth = -40 # spike threshold (V)
## Input stimulus
I = 3.1 # input current (nA)
Vm[0] = -70
Fr = 0
## iterate over each time step
def func(Ie, Vm, Fr):
for i, t in enumerate(time):
if i == 0:
Vm[i] = -70
else:
Vm[i] = Vm[i-1] + (El- Vm[i-1] + Ie*Rm) / tau_m * dt
if Vm[i] >= Vth:
Fr += 1
Vm[i] = El
return
Ie = 3.1
func( Ie, Vm, Fr)
print Fr
## plot membrane potential trace
plot(time, Vm)
title('Leaky Integrate-and-Fire')
ylabel('Membrane Potential (mV)')
xlabel('Time (msec)')
ylim([-70,20])
show()
为什么在调用func之后,Fr仍然是0?
我知道这很简单,但我已经浪费了很长时间在这个
谢谢
答案 0 :(得分:3)
你有两个不同范围的Fr变量
Fr = 0
在你的功能之外,因此永远不会改变。
Fr += 1
在函数内部并且会递增,但这是一个不同的变量。
这是解决方案(可能的解决方案之一):
def func(Ie, Vm, Fr):
for i, t in enumerate(time):
if i == 0:
Vm[i] = -70
else:
Vm[i] = Vm[i-1] + (El- Vm[i-1] + Ie*Rm) / tau_m * dt
if Vm[i] >= Vth:
Fr += 1
Vm[i] = El
return Fr
然后,就这样做
Fr = func(Ie, Vm, Fr)
还有一个提示。
如果您的Fr
变量默认为0,则可以执行以下操作:
def func(Ie, Vm, Fr=0):
定义函数时,仅在需要不同的0时才传递第三个参数。
答案 1 :(得分:2)
如果您想修改函数范围之外的变量,则需要使用global
关键字
my_var = True # Declare a variable on the global scope
def my_function():
global my_var # tell the interpreter that you want to use the global "my_var"
my_var = False # Change global my_var value
my_function() # call the function
print my_var # check result
但请注意,这样做并不是一种好习惯。
您应该尝试尽可能多地隔离代码中的作用域,以使其更具可读性。
my_var = 3 # Declare a variable on the global scope
def my_function(my_var):
return my_var + 1
my_var = my_function(my_var) # call the function and assign result to global variable
print my_var # check result