我对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
函数调用nestedfun1
和nestfun2
,但是变量是嵌套函数的本地变量,所以在这两个嵌套函数被调用之后,变量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+1
?x=5
更早,但它是嵌套函数。
c)变量仍然是本地的,调用nestfun2
后,为什么变量x=5
可以转移到x=x+1
?
d)如果x=x+1
被删除,main2
也可以成功运行。但是如果只将其更改为x
,main2
会产生错误(“标识符'x'不是函数或共享变量”),为什么?
1条答案
按热度按时间rfbsl7qr1#
是的,局部变量只在函数运行期间存在(除非它被标记为
persistent
)。每次函数开始运行时都会创建一个新的工作区,然后这个工作区就会被销毁。每个函数都有自己的工作区,因此不同函数中同名的变量可以保持独立。嵌套函数有点不同,因为它不仅可以访问自己工作区中的变量,还可以访问其父工作区中的变量。
MATLAB的变量作用域与Python或C等语言有点不同。在这些语言中,变量从创建的那一刻起就存在,直到其作用域结束。在MATLAB中,它们存在于函数的完整运行期间。MATLAB首先解析整个函数,然后编译它。因此,在函数开始时,它已经知道
x
将在稍后定义。在函数执行期间,名称不能更改函数。你不能使用例如。cos
作为函数和变量。事产生错误,因为
cos
在函数的整个范围内被理解为变量,而不是函数。因此,cos(5)
索引到一个尚未分配任何值的变量。这就是导致
main2
以这种方式工作的原因:x
在函数开始时是函数作用域(工作区)中的变量。调用嵌套函数时会赋值给这个变量,而不是嵌套函数工作区中的本地变量,因为它已经存在于父工作区中。