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

Matlab中的持久变量(persistent)的理解,第1张

语法
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]

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/563782.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-03
下一篇 2022-04-03

发表评论

登录后才能评论

评论列表(0条)

保存