Matlab中的持久变量(persistent)的理解

语法

persistent var1 ... varN

说明

persistent 将变量var1…..varN 声明为持久变量。持久变量是声明它们的函数的局部变量;但其值保留在对该函数的各次调用所使用的内存中,Matlab命令行和其它函数中的代码不能更改持久变量。当 MATLAB 首次遇到特定 persistent 语句时,它将持久变量初始化为空矩阵 ([])。在您清除或修改内存中的函数时,MATLAB 会清除持久变量。

示例

函数调用计数

在当前工作文件夹中创建函数 myFun。每次调用函数时,n 的值都会增加。

function myFun()
    persistent n
    if isempty(n)
        n = 0;
    end
    n = n+1
end

在命令提示符下,调用 myFun 三次。

myFun
myFun
myFun


输出

n =

     1


n =

     2


n =

     3

清除 myFun 并再调用它两次。清除该函数会同时清除持久变量。

clear myFun
myFun
myFun



输出

n =

     1


n =

     2
  • 持久变量与全局变量类似,因为 MATLAB 为二者都建立持久存储。二者的区别在于持久变量仅为声明它们的函数所知晓。因此,MATLAB 命令行或其他函数中的代码不能更改持久变量。

  • 由于 MATLAB 将持久变量初始化为一个空矩阵 ([]),通常函数会检查持久变量是否为空,如果是,则初始化该持久变量。

  • global和persistent

    1.persistent :相当于c++中的Static,定义静态变量。而static是关键字,就是静态局部变量,即使在声明时未付初值,编译器也会把它初始化为0,且静态局部变量存储于进程的全局数据区,即使函数返回,它的值也会保持不变。静态局部变量的效果跟全局变量有一拼,但是位于函数体内部,就极有利于程序的模块化了。

    2.把在函数中声明的局部变量保存到内存中,供以后调用该函数使用。定义的变量类似全局变量会一直存在内存中,但不同的是persistent变量只能被所被定义的函数使用,这样能够防止被其他函数或其他命令所改变。

    persistent变量只有在m文件被改变或被从内存中清除,该变量才会被清除。

    persistent变量初始化为一个空矩阵

    python中变量持久化

    import pickle
    a = [[1,2],[2,3,4,5]]                   #单变量的储存
    
    f = open('store.pkl', 'wb')
    pickle.dump(a, f)
    f.close()
    #多变量保存
    
    
    a = [[5,6,7],[7,8]]
    b = ['a','b',"c"]
    c = "哈萨克斯"
    d = "shsjka"                               #多变量的储存
    
    f = open('store.pkl', 'wb')
    pickle.dump([a,b,c,d], f)    #把a,b,c,d存储到文件中,wb表示写入
    f.close()
    
    #加载
    import pickle
    f = open('store.pkl', 'rb')
    storedata= pickle.load(f)
    print(storedata)
    f.close()  #关闭文件
    
    '''输出
    [[[5, 6, 7], [7, 8]], ['a', 'b', 'c'], '哈萨克斯', 'shsjka']
    '''

    Python的局部静态变量

    哈哈,看了这么久的博客,python居然没有局部静态变量,这就很难受了。找到几种方式看是否可行。

    定义函数属性

    def func():
        func.m+=1
        print(func.m)
    func.m=0
    func()
    func()
    1
    2

    默认参数

    
    def func(x=[0]):
        x[0]+=1
        print(x[0])
    func()
    func()
    1
    2

    Python解释器在执行def语句时,会给函数的默认参数创建一个对象实例,当该参数是一个可变对象时,可以用于记录函数的状态,类似于局部静态变量的功能。

    静态方法

    首先了解几个概念:

    全局变量:在模块内,在所有函数外面,在class外面。

    局部变量:在函数内,在class的方法内。

    静态变量:在class内的,但不在class的方法内

    a = 1
    b = [2, 3]
    
    def func():
        a = 2
        print ("in func a:", a) 
        b[0] = 1
        b.append(6)                    #b的第一个元素改为1,在最后一列增加6
        print ("in func b:", b)
    
    if __name__ == '__main__':
        print( "before func a:", a)
        print ("before func b:", b)
        func()
        print ("after func a:", a)
        print ("after func b:", b)
    
    
    before func a: 1
    before func b: [2, 3]
    in func a: 2
    in func b: [1, 3, 6]
    after func a: 1
    after func b: [1, 3, 6]

    全局变量的修改,加入global声明:

    
    a = 1
    b = [2, 3]
    
    def func():
        global a
        a = 2         #声明全局变量
        print ("in func a:", a)
        b[0] = 1
        print ("in func b:", b)
    
    if __name__ == '__main__':
        print ("before func a:", a)
        print ("before func b:", b)
        func()
        print ("after func a:", a)
        print ("after func b:", b)
    
    
    
    before func a: 1
    before func b: [2, 3]
    in func a: 2
    in func b: [1, 3]
    after func a: 2
    after func b: [1, 3]

    来源:XUE FENG!

    物联沃分享整理
    物联沃-IOTWORD物联网 » Matlab中的持久变量(persistent)的理解

    发表评论