首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Julia scoping:为什么这个函数要修改全局变量?

Julia scoping:为什么这个函数要修改全局变量?
EN

Stack Overflow用户
提问于 2020-06-23 20:20:29
回答 1查看 481关注 0票数 3

对于Julia来说,我是一个相对较新的人,到目前为止,我是它的粉丝。但是,来自多年的R编程经验,一些作用域规则让我感到困惑。

让我们来看看这个函数。这完全符合我的预期。

代码语言:javascript
复制
function foo1(x)
    y = x
    t = 1
    while t < 1000
      t += 1
      y += 1
    end
    return 42
end

var = 0;
foo1(var)
# 42
var
# 0

但是当在数组上做类似的事情时,它就像一个变异函数(在全局作用域中修改它的参数!)

代码语言:javascript
复制
function foo2(x)
    y = x
    t = 1    
    while t < 1000
      t += 1
      y[1] += 1
    end
    return 42
end

var = zeros(1);
foo2(var)
# 42
var
# 999.0

我意识到我可以通过将第一行改为y = copy(x)来解决这个问题,但是为什么会出现这样的(危险?)首先是行为吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-23 20:45:01

我会写一个答案,但我认为John Myles怀特已经比我做得更好了,所以我只需链接到他的博客帖子:

https://www.juliabloggers.com/values-vs-bindings-the-map-is-not-the-territory-3/

简而言之,x = 1x[1] = 1是非常不同的操作。第一个是赋值-即更改变量x-while的绑定第二个是调用setindex!函数的语法糖,在数组的情况下,该函数赋值给数组中的一个位置。赋值只会改变哪些变量引用哪些对象,而不会修改任何对象。突变只会修改对象,而不会改变哪些变量引用哪些对象。这个答案有更多关于区别的细节:Creating copies in Julia with = operator

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62534592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档