为什么for循环中的赋值可以更改全局变量而它不能正常工作?

时间:2015-10-16 00:25:46

标签: julia

以下内容返回1,表示已创建local x

x = 1
bar() = (x = 2)
bar() # 2
x # 1

返回5,表示x指的是全局的。

x = 1
for i = 1:5
    x = i
end
x # 5

参考示例:此循环无法更新全局。

x = 10
function foo(n)
  for i = 1:n
    x = i
  end
  1
end

foo(2), x # 1, 10

更新

来自@ matt-b的链接非常有用。这实际上是软范围与硬范围see here的结果。总而言之,功能范围用于像循环范围一样工作,直到软范围的引入发生了中断变化。硬范围。文档不是很快。

2 个答案:

答案 0 :(得分:1)

如果要在函数范围内使用全局x,则必须将其声明为global

x = 10
function foo(n)
  global x
  for i = 1:n
    x = i
  end
  1
end

foo(2), x # 2

正如@colinfang评论的那样,在Julia中,函数范围和循环范围的处理方式不同,我认为文档中的以下句子试图解决这个问题:

  

Julia使用词法范围,这意味着函数的范围不是   继承自其调用者的范围,但是从其范围中继承   功能已定义。

答案 1 :(得分:0)

来自@ matt-b的链接非常有用。这实际上是软范围与硬范围see here的结果。总而言之,功能范围用于像循环范围一样工作,直到软范围的引入发生了中断变化。硬范围。文档不是很快。