如何在python中增加函数的全局变量

时间:2015-05-15 13:36:03

标签: python

我被一个像

这样的简单增量函数所困扰
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?

我知道这很简单,但我已经浪费了很长时间在这个

谢谢

2 个答案:

答案 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