MATLAB中嵌套函数的变量作用域

ippsafx7  于 2023-10-23  发布在  Matlab
关注(0)|答案(1)|浏览(273)

我对MATLAB中嵌套函数中变量的作用域有点困惑。
1.正如nested function帮助文档所解释的那样:valable保持在嵌套函数的本地。

function main
   nestedfun1
   nestedfun2

   function nestedfun1
      x = 1;
   end

   function nestedfun2
      x = 2;
   end
save('maindata')
end

“remains local”是否意味着变量在调用嵌套函数后被删除?还是将它们保持在嵌套的本地工作区中?
我的观点:main函数调用nestedfun1nestfun2,但是变量是嵌套函数的本地变量,所以在这两个嵌套函数被调用之后,变量x被移除(删除),所以maindata.mat是空的,对吗?
1.在父函数和嵌套函数之间共享变量。

function main2
nestfun2

   function nestfun2
      x = 5;
   end 
   
x = x + 1;
end

main2可以成功运行,但我不明白的是:
a)nestfun2的调用在x=x+1之前,为什么main函数可以运行?调用nestfun2时没有定义变量x
B)MATLAB解析函数的哪一行来查看将创建什么变量?x=5还是x=x+1x=5更早,但它是嵌套函数。
c)变量仍然是本地的,调用nestfun2后,为什么变量x=5可以转移到x=x+1
d)如果x=x+1被删除,main2也可以成功运行。但是如果只将其更改为xmain2会产生错误(“标识符'x'不是函数或共享变量”),为什么?

rfbsl7qr

rfbsl7qr1#

是的,局部变量只在函数运行期间存在(除非它被标记为persistent)。每次函数开始运行时都会创建一个新的工作区,然后这个工作区就会被销毁。每个函数都有自己的工作区,因此不同函数中同名的变量可以保持独立。
嵌套函数有点不同,因为它不仅可以访问自己工作区中的变量,还可以访问其父工作区中的变量。
MATLAB的变量作用域与Python或C等语言有点不同。在这些语言中,变量从创建的那一刻起就存在,直到其作用域结束。在MATLAB中,它们存在于函数的完整运行期间。MATLAB首先解析整个函数,然后编译它。因此,在函数开始时,它已经知道x将在稍后定义。在函数执行期间,名称不能更改函数。你不能使用例如。cos作为函数和变量。事

function bad
cos(5)
cos = 5;
end

产生错误,因为cos在函数的整个范围内被理解为变量,而不是函数。因此,cos(5)索引到一个尚未分配任何值的变量。
这就是导致main2以这种方式工作的原因:x在函数开始时是函数作用域(工作区)中的变量。调用嵌套函数时会赋值给这个变量,而不是嵌套函数工作区中的本地变量,因为它已经存在于父工作区中。

相关问题