Julia 作用域:为什么这个函数会修改全局变量?

2024-03-20

我是 Julia 的新手,但到目前为止我还是它的粉丝。但根据多年的 R 编程经验,一些范围规则让我感到困惑。

我们来看看这个函数。这与我的预期完全一致。

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

但是当在数组上做类似的事情时,它充当一个变异函数(在全局范围内修改它的参数!)

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),但是这种(危险的?)行为的原因到底是什么?


我会对此写一个答案,但我认为约翰·迈尔斯·怀特已经比我做得更好了,所以我将链接到他的博文:

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

简而言之x = 1 and x[1] = 1是非常不同的操作。第一个是作业,即更改变量的绑定x——而第二个是一个语法糖,用于调用setindex!函数,在数组的情况下,分配给数组中的一个位置。赋值只会改变哪些变量引用哪些对象,而不会修改任何对象。变异仅修改对象,而不会改变哪些变量引用哪些对象。这个答案对区别有更多细节:在 Julia 中使用 = 运算符创建副本 https://stackoverflow.com/questions/33002572/creating-copies-in-julia-with-operator/33003055#33003055.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Julia 作用域:为什么这个函数会修改全局变量? 的相关文章

  • Python 中的嵌套函数如何工作?

    def maker n def action x return x n return action f maker 2 print f print f 3 print f 4 g maker 3 print g 3 print f 3 st
  • 主流编译器是否将引用传递基本类型转换为复制传递?

    通过引用传递对象是向其传递地址的更简单 更快且更安全的方法 但对于大多数编译器来说 都是一样的 引用实际上是指针 现在基本类型怎么样int 将地址传递给int在函数内部使用它会比通过复制传递它慢 因为在使用之前需要取消引用指针 现代编译器如
  • R 中函数的运算符重载 - 奇怪的行为

    不幸的是像这样的事情 f g 3 其中 f 和 g 都是一元函数 在 R 中不起作用 因此 我尝试通过以下方式重载一元函数的 运算符 function function e1 e2 return function x e1 x e2 x 但
  • 为什么这个函数被应用于一个没有作为参数调用的变量?

    我尝试编写的一些代码遇到了问题 我正在尝试获取坐标列表列表 表示 3D 中形状的可能位置 并形成一个列表 其中包含原始列表中的所有元素以及原始列表中旋转的元素 以便 x y z 坐标也被移动以包括 z x y 和 y z x 我认为用一个例
  • 为什么我不能在 try 块内定义之前使用 Javascript 函数?

    正如所讨论的here https stackoverflow com questions 261599 why can i use a function before its defined in javascript 函数定义可以在定义之
  • 有没有办法使用 perf 工具查找流程中各个功能的性能?

    我正在尝试在流程中实现各个功能的性能 我该如何使用 perf 工具来做到这一点 还有其他工具吗 例如 假设 main 函数调用函数 A B C 我想分别获得主要功能以及功能 A B C 的性能 有没有一个很好的文档来了解 perf 源代码
  • 如何获取 bash 中的第 n 个位置参数?

    如何获得nBash 中的第一个位置参数 其中n是变量吗 使用 Bash 的间接功能 bin bash n 3 echo n 运行该文件 ind apple banana cantaloupe dates 生产 cantaloupe Edit
  • PHP函数十六进制或RGB颜色到颜色名称

    是否有一个 php 函数可以通过给出 rgb 或十六进制颜色作为参数来返回最接近的颜色名称 我已经搜索了很多 但找不到可以完成这项工作的函数 请帮忙 请参阅下面我的代码 我用它来复制徽标颜色以在运行时自动更改网站主题 希望它有效 只需将图像
  • 如何获取数组中每个数字的阶乘值?

    我试图使用此方法获取数组中每个项目的阶乘值 但这仅输出一个值 任何人都可以帮助我找出我做错的地方吗 function mathh arr fn for i 1 i lt sizeof arr i arr2 arr2 i fn arr i r
  • 在 Julia 中提取参数类型

    假设我在 Julia 中编写了一个函数 它接受Dict K V 作为参数 然后创建类型的数组Array K 1 and Array V 1 我怎样才能提取类型K and V来自 Dict 对象 以便我可以使用它们来创建数组 斯文和约翰的答案
  • “形式参数“foo”与多个参数匹配”-如何在 R 中处理这个问题?

    有时 调用带有某些参数的函数会导致错误消息formal argument foo matched by multiple actual arguments 是否可以打印不明确的实际参数列表 我问这个问题的原因是目前的问题plot类对象的函数
  • 如何让我的用户脚本也在隔离沙箱和 unsafeWindow 中执行代码?

    对于我的用户脚本中的大部分代码 我需要使用unsafeWindow对于我的脚本执行的网站 我通过使用来做到这一点 grant unsafeWindow 但是 我的一些代码无法执行unsafeWindow并且需要在 Tampermonkey
  • 如何声明返回函数指针的函数指针

    如何声明一个函数指针 该指针指向具有相同参数的函数 并返回一个指向具有相同参数的函数的指针 i e funcPtr指着func1 int a int b and func1返回指向另一个函数的指针func2 int a int b func
  • Python中如何从另一个函数调用一个函数内的函数? [复制]

    这个问题在这里已经有答案了 我已经在 python 中的另一个函数中定义了一个函数 现在我想调用内部函数 在Python中这可能吗 我怎么打电话func2 from func3 def func1 def func2 print Hello
  • Python 中函数未定义错误

    我试图在 python 中定义一个基本函数 但当我运行一个简单的测试程序时 我总是收到以下错误 gt gt gt pyth test 1 2 Traceback most recent call last File
  • Julia 中 @with_kw 和 Base.@kwdef 之间的区别?

    受到这个问题评论的启发 with kw 在 Julia 中做什么 https stackoverflow com questions 69586136 what does with kw do in julia 有什么区别 with kw
  • 如何列出运行时函数的所有调用?

    有什么办法可以list 在VS中显示 写入文件 所有来电者 对象 函数 一个函数的当程序运行时 可能使用调试器 我需要record 所有通话 包括来电者 一个函数的从计划启动到终止 简单扫描源代码或二进制文件不做这份工作因为该程序可以作为服
  • Delphi:平滑折叠/展开形式

    需要你的帮助 我一直在寻找 我在德尔福西雅图 试图平滑调整表单底部的大小 就我而言 调整大小 只是有点折叠 展开 如下所示 我怎样才能意识到这一点 我尝试过使用 TTimer procedure TForm1 Timer1Timer Sen
  • Typescript 中此子范围的问题

    This is ALMOST和其他人一样this到目前为止 我已经读过范围界定问题 除了一个细微的差别之外 这使得提出这个问题变得有意义 imo 现在最初我的问题是范围this使用 Knockout 和 Typescript 因此给出以下内
  • Bash 函数中的返回值

    我正在使用 bash 脚本 我想执行一个函数来打印返回值 function fun1 return 34 function fun2 local res fun1 echo res 当我执行时fun2 它不打印 34 为什么会这样呢 虽然

随机推荐

  • 解析 DateFormat 时的 Java 时区

    我的代码解析日期如下 String ALT DATE TIME FORMAT yyyy MM dd T HH mm ss SSSZ SimpleDateFormat sdf new SimpleDateFormat ALT DATE TIM
  • android AppWidget 未添加到 Lollipop 上的主屏幕

    我开发了一个应用程序 可以在主屏幕小部件上显示新闻源 由于以下情况 在 Lollipop 之前的 Android 设备上一切正常 用户进入启动器的小部件屏幕以选择 添加特定的小部件 用户单击 MyNewsWidget 以添加到其主屏幕 调用
  • 让 div 占据另一个 div 后剩余的所有空间

    我有两个并排的 div 第一个包含一个可能相当长的文本字段 另一个包含一个很短的数字 我需要第一个 div 占据所有可用空间 而无需拉伸父级并在必要时进行剪切 Ant 它应该考虑第二个 div 的宽度 因此 如果文本的长度很短 那么两个 d
  • linuxrc 的用途是什么以及 rootfs 中是否需要它?

    Question 我的问题是 什么是linuxrc做 我需要它吗 rootfs 和使用有什么关系吗systemd vs initd 背景 我目前正在尝试建立一个rootfs适用于使用 Yocto 的 ARM 7 处理器 我对原始 BSP 项
  • docx4j - 删除 wml P 元素

    我正在使用 docx4j 来处理 Microsoft Word 模板 我想知道如何删除或隐藏模板中的 P 元素 我能够遍历代码来获取特定的 P 元素 现在我需要知道如何删除或隐藏该 P 元素 有人可以帮忙吗 我使用以下代码获取所有 P 元素
  • 按 Enter 键提交搜索?

    当有人按下 回车 键时 需要做什么才能提交此表单
  • Visual Studio 弹出窗口:“操作无法完成”

    当我尝试打开一个项目时 无论是本地项目还是在团队基础服务器 https en wikipedia org wiki Team Foundation Server TFS 我得到一个模态窗口告诉我 操作无法完成 未指定的错误 或者相同的消息
  • 内存怎么这么大?

    我有一个 1000x1500 像素位图 我想在 Android 中制作一个可变副本 当我运行以下代码时 int width original getWidth 1000px int height original getHeight 150
  • C++中的restrict关键字是什么意思?

    我总是不确定 restrict关键字在C 中意味着什么 这是否意味着赋予函数的两个或多个指针不重叠 还有什么意思呢 在他的论文中 内存优化 https web archive org web 20160422113037 http www
  • 如何在 sunos 中获取附加到特定端口的进程 ID

    我正在尝试在 SunOS 上使用端口 7085 连接进程 我尝试执行以下命令 netstat ntlp grep 7085没有返回任何东西 netstat anop grep 7085也尝试过这个 此开关在 SunOs 中无效 我得到以下输
  • numpy:有效地添加矩阵的行

    我有一个矩阵 mat array 0 1 2 3 4 5 6 7 8 9 10 11 我想获得某些索引处的行的总和 例如 ixs np array 0 2 0 0 0 1 1 我知道我可以将答案计算为 mat ixs sum axis 0
  • 如何在不使用登录系统的情况下识别唯一用户(iOS)

    我需要一种方法来识别我的应用程序的用户 但没有登录系统 我研究了 UUID 它为我的问题提供了部分答案 但由于它不是真正的 UDID 因此它不是 真正唯一的 如果用户重新安装应用程序 他会获得一个新的 UUID 这可以 不为我工作 有什么方
  • 如何使用flex4使用前置摄像头

    我使用 Flex 4 为 Android 移动设备开发了简单的相机应用程序 问题是 当我运行该应用程序时 它使用后置摄像头 它没有使用前置摄像头 怎么换相机啊 我需要使用前置摄像头来实现此应用程序 请帮助我 var camera Camer
  • 不是动态选择字段 WTFORMS 的有效选择

    我目前正在使用 WTFORMS 创建动态选择字段 但是它从未提交并且验证失败并出现以下错误 Not a valid choice 我的字段是这样创建的 area SelectField 在视图中 我从数据库中获取选项 如下所示 form M
  • 外部元素边距不等于内部元素边距

    我正在使用 Android WebView 来显示我的应用程序的 HTML 内容 我需要动态查找元素 通常是 div 的完整高度 包括填充 边距和边框 我正在使用 JavaScript 无法使用 jQuery 我一直在使用scrollHei
  • 如何在多租户数据库中设置唯一约束

    这是一个多租户应用程序 所有记录都有一个客户 ID 来分隔客户数据 客户可以在此表中插入自己的数据并设置自己的唯一约束 每个客户都可以对 15 个字段中的任何一个字段设置唯一约束 也可以不设置任何约束 因此 在实际表上设置唯一约束是行不通的
  • 如何在装饰器中获取 Flask 可选 URL 参数?

    我的 Flask API 都使用电话作为可选的 url 参数 如下所示 我想使用装饰器来验证电话号码是否正确 那么我可以在不解析请求url的情况下在某处获取参数 phone 吗 user api route
  • 在更改视图网格 fullcalendar v4 上拖放后,带有 rrule 插件的事件不会更新

    我目前正在使用 rrule 插件开发 Fullcalendar v4 我有这个代码 var calendarEl document getElementById calendardemo var calendar new FullCalen
  • 如何将列表视图放入片段中

    如何将列表视图放入片段中 我使用带有固定选项卡的默认项目设置 它似乎不起作用 我的应用程序崩溃了 主要活动 import java util ArrayList import java util HashMap import java ut
  • Julia 作用域:为什么这个函数会修改全局变量?

    我是 Julia 的新手 但到目前为止我还是它的粉丝 但根据多年的 R 编程经验 一些范围规则让我感到困惑 我们来看看这个函数 这与我的预期完全一致 function foo1 x y x t 1 while t lt 1000 t 1 y