scope - 在 if 语句中使用全局声明(Julia 代码)
问题描述
如果 elseif else 阻塞,为什么我在它们相同时声明变量是全局的?我错过了什么?
function f(N)
for n in 0:N
if n == 0
fibonacci_n = 0
fibonacci_n_1 = fibonacci_n
elseif n == 1
fibonacci_n = 1
fibonacci_n_1 = fibonacci_n
fibonacci_n_2 = fibonacci_n_1
else
global fibonacci_n_1, fibonacci_n_2
fibonacci_n = fibonacci_n_1 + fibonacci_n_2
fibonacci_n_1 = fibonacci_n
fibonacci_n_2 = fibonacci_n_1
end
@printf "%5i %10i\n" n fibonacci_n
end
end
解决方案
您遇到的问题实际上与全局范围无关,您不必在此处声明任何全局内容。global
如果您想对全局变量进行写访问,则关键字是必需的。
您的global
关键字引入了新的全局绑定fibonacci_n_1
和fibonacci_n_2
. global
将关键字放在范围内的哪个位置并不重要。您甚至可以访问函数终止后的最后一个值:fibonacci_n_1
在全局范围内尝试。fibonacci_n_2
f(5); println(fibonacci_n_1)
如果您删除global
函数中的声明,fibonacci_n_1
并且fibonacci_n_2
将在您的for
-loop 的本地范围内定义。因此,不会存在全局范围访问问题。但是,您遇到的问题将与循环块中引入的变量的以下行为有关。
for
loops、while
loops 和 Comprehensions 具有以下行为:在其主体范围内引入的任何新变量都是为每次循环迭代新分配的,就好像循环体被一个 let 块包围https://docs.julialang.org/en/v1/manual/variables-and-scoping/#For-Loops-and-Comprehensions-1
这意味着如果您在-loop 中引入该变量,您将无法在上一次迭代中访问该变量的值或绑定。这与Python 或 MATLAB 循环中引入的变量的行为不同。for
相反,您可以在 for 循环之外但在函数内部定义此类变量。
function f(N)
fibonacci_n, fibonacci_n_1, fibonacci_n_2 = 0, 0, 0
for n in 0:N
if n == 0
fibonacci_n = 0
fibonacci_n_1 = fibonacci_n
elseif n == 1
fibonacci_n = 1
fibonacci_n_2 = fibonacci_n_1
fibonacci_n_1 = fibonacci_n
else
fibonacci_n = fibonacci_n_1 + fibonacci_n_2
fibonacci_n_2 = fibonacci_n_1
fibonacci_n_1 = fibonacci_n
end
@printf "%5i %10i\n" n fibonacci_n
end
end
有关 Julia 中变量范围的更多相关讨论,请参阅Julia 文档的变量范围部分。
推荐阅读
- sql - Oracle Apex 更新表的特定行
- octave - 在Matlab中,变量后面有一个点这个表达式是什么意思?
- python - 使用 Beautifulsoup 4 进行网页抓取 - 提取联系信息
- javascript - 通过套接字将视频从 ReactNative 应用程序发送到 Python 服务器
- excel - Power Query:从在线 Excel 工作簿(OneDrive、SharePoint)中获取数据
- php - 在 WooCommerce 管理员订单中更改订单项目自定义元数据显示的标签和值
- javascript - 在工厂函数中使用传播而不是类`extends`
- spring - Thymeleaf th:文本错误地从消息转换为布尔值
- google-bigquery - 禁用 Big Query 的结果集缓存
- django - 如何从多个 m2m 文件中为查询集(select2)准备一个列表