Julia 中的“==”和“===”比较运算符有什么区别?

2024-02-01

有什么区别== and ===Julia 中的比较运算符?


@ChrisRackauckas 的答案就其本身而言是准确的——即对于可变对象。然而,这个问题的含义远不止于此,所以我将在这里详细说明一下。

The ===运算符(的别名is函数)实现 Henry Baker 的 EGAL 谓词 [1 http://home.pipeline.com/~hbaker1/ObjectIdentity.html, 2 http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.23.9999]: x === y当两个对象在编程上无法区分时,即为真 - 即,您无法编写代码来证明两者之间的任何差异x and y。这归结为以下规则:

  • 对于可变值(数组、可变复合类型),===检查对象身份:x === y为真,如果x and y是同一个对象,存储在内存中的同一位置。
  • 对于不可变的复合类型,x === y为真,如果x and y具有相同的类型 - 因此具有相同的结构 - 并且它们相应的组件都是递归的===.
  • 对于位类型(不可变的数据块,例如Int or Float64), x === y为真,如果x and y包含完全相同的位。

这些规则,递归地应用,定义了行为===.

The ==另一方面,函数是用户可定义的,并实现“抽象值相等”。过载能力是一个关键区别:

  • The ===不可重载——它是一个具有固定、预定义行为的内置函数。您无法扩展或更改其行为。
  • The ==可重载——它是一个带有中缀语法的普通(对于 Julia)泛型函数。它具有后备定义,可以为用户定义的类型提供有用的默认行为,但您可以通过添加新的、更具体的方法来更改您认为合适的设置==适合您的类型。

提供有关如何进行的更多详细信息==对于内置类型的行为以及当人们扩展它时它对于用户定义类型的行为应该如何,从the docs http://docs.julialang.org/en/release-0.4/stdlib/math/?#Base.==:

例如,所有数字类型都按数值进行比较,忽略 类型。字符串作为字符序列进行比较,忽略 编码。

您可以将其视为“直观平等”。如果两个数在数值上相等,则它们是==:

julia> 1 == 1.0 == 1 + 0im == 1.0 + 0.0im == 1//1
true

julia> 0.5 == 1/2 == 1//2
true

但请注意,==实现精确的数值相等:

julia> 2/3 == 2//3
false

这些值不相等,因为2/3是浮点值0.6666666666666666,这是最接近的Float64到数学值 2/3 (或用 Julia 表示法表示有理值,2//3), but 0.6666666666666666不完全等于 2/3。而且,==

遵循浮点数的 IEEE 754 语义。

这包括一些可能意想不到的属性:

  • 有明显的正浮点零和负浮点零(0.0 and -0.0): 他们是==,尽管它们的行为不同,因此不是===.
  • 有许多不同的非数字(NaN)值:它们不是==对自己、对彼此或任何其他价值;他们每个人===对他们自己,但不是!==彼此之间,因为它们有不同的位。

例子:

julia> 0.0 === -0.0
false

julia> 0.0 == -0.0
true

julia> 1/0.0
Inf

julia> 1/-0.0
-Inf

julia> NaN === NaN
true

julia> NaN === -NaN
false

julia> -NaN === -NaN
true

julia> NaN == NaN
false

julia> NaN == -NaN
false

julia> NaN == 1.0
false

这有点令人困惑,但这就是 IEEE 标准。

此外,文档==还指出:

集合一般应实现==通过致电==递归地处理所有内容。

因此,价值平等的概念由下式给出==递归地扩展到集合:

julia> [1, 2, 3] == [1, 2, 3]
true

julia> [1, 2, 3] == [1.0, 2.0, 3.0]
true

julia> [1, 2, 3] == Any[1//1, 2.0, 3 + 0im]
true

因此,这继承了标量的缺点==比较:

julia> a = [1, NaN, 3]
3-element Array{Float64,1}:
   1.0
 NaN
   3.0

julia> a == a
false

The ===另一方面,比较总是测试对象同一性,因此即使两个数组具有相同的类型并包含相同的值,只有当它们是相同的数组时它们才相等:

julia> b = copy(a)
3-element Array{Float64,1}:
   1.0
 NaN
   3.0

julia> a === a
true

julia> a === b
false

julia> b === b
true

原因是a and b不是===是即使他们现在这里碰巧包含相同的数据,因为它们是可变的而不是同一个对象,您可以改变其中之一,然后很明显它们是不同的:

julia> a[1] = -1
-1

julia> a # different than before
3-element Array{Int64,1}:
 -1
  2
  3

julia> b # still the same as before
3-element Array{Int64,1}:
 1
 2
 3

因此你可以说a and b通过突变是不同的对象。相同的逻辑不适用于不可变对象:如果它们包含相同的数据,那么只要它们具有相同的值,它们就无法区分。因此,不可变值不再受特定位置的束缚,这是编译器能够如此有效地优化不可变值的使用的原因之一。

也可以看看:

  • 摆脱 Julia 的“警告:为未更改的字符串重新定义常量”? https://stackoverflow.com/questions/37857436/get-rid-of-julias-warning-redifining-constant-for-strings-that-are-not-chang/37862270#37862270
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Julia 中的“==”和“===”比较运算符有什么区别? 的相关文章

  • 处理 Julia 中 kwargs 的类型

    我该如何使用kwargs在 Julia 函数中并声明其类型以提高速度 function f x Float64 kwargs kwargs Dict kwargs if haskey kwargs c c Float64 kwargs c
  • 有什么方法可以获取模块中定义的函数列表?

    是否有任何内省的魔法可以给我一个模块中定义的函数列表 module Foo function foo foo end function bar bar end end 一些神话般的功能 例如 functions in Foo 这将返回 fo
  • 更改视图、plot3D、Julia 语言(类似于 matplotlib)

    我正在尝试改变 3D 散点图的视角 朱莉娅语言 例如 此代码更改了视角 但每次更改时都会单独绘制点 而不是一起绘制 for i 1 10 X i Y i 2 Z i 3 fig figure ax gca projection 3d plo
  • 根据另一列的相应行值创建行子集?

    让 CSV 包含两列 年龄 和 性别 其中 Age 30 24 55 61 70 21 Gender Male Female Male Male Male Female 我希望它向我显示与 Gender Male 相对应的所有 Age 值
  • 有没有办法在 julia-lang 中构建包依赖关系树?

    Using npm list将显示已安装的软件包 版本和关系的树 尽管 Julia 包管理有所不同 例如 通常不存在包的重复副本 但有什么方法可以 知道为什么要安装一个软件包吗 或构建包依赖关系树 我认为没有一个简单的函数 但是使用这两个函
  • 朱莉娅:当我有情节时如何找到最佳拟合曲线/方程?

    朱莉娅 当我有情节时如何找到最佳拟合曲线 方程 我有一个用地图绘制的图 但我需要找到一个适合这个的二次方程 正如评论中所说 情节在这里并不重要 只有数据本身是 您可以使用诸如GLM构建数据的 广义 线性模型 并可能绘制它们或使用它们来预测新
  • Julia DataFrames 中的高效自定义排序?

    有没有一种快速的方法来指定自定义订单sort sort 在 Julia 数据框架上 julia gt using DataFrames julia gt srand 1 julia gt df DataFrame x rand 10 y r
  • 在 Julia 中,有没有办法让“现在”(至少)达到毫秒精度?

    通常 要了解代码中发生的情况 您需要高精度时间来分析您的应用程序或出于其他原因 显然 现在 https stackoverflow com questions 32407509 how to get the milliseconds fro
  • 在 Julia 中提取参数类型

    假设我在 Julia 中编写了一个函数 它接受Dict K V 作为参数 然后创建类型的数组Array K 1 and Array V 1 我怎样才能提取类型K and V来自 Dict 对象 以便我可以使用它们来创建数组 斯文和约翰的答案
  • 如何防止已删除的软件包在 Julia 中更新?

    该问题的标题乍一看可能令人困惑 但它是有效的 我安装了Makie jl不久前打包 然后使用成功删除它pkg gt rm Makie 今天我尝试使用以下命令更新所有软件包 如果有的话 pkg gt up 但我得到了一个令人兴奋的日志 Inst
  • 带有 return 语句的 Julia @parallel for 循环

    如何在满足条件时立即返回所有工作人员的函数中编写并行 for 循环 IE 像这样的东西 function test n sync parallel for i in 1 1000 statement if condition return
  • Julia 1.6.2 未出现在 Jupyter 笔记本中

    我已经根据这个网站安装了 julia 1 6 2 jupyter notebook 和 anaconda 3 https datatofish com add julia to jupyter https datatofish com ad
  • 用以前的非缺失值填充“缺失”值的有效方法是什么?

    我有一个向量 using Missings v allowmissing rand 100 v rand 100 lt 0 1 missing 最好的填充方式是什么v与最后一个非缺失值 现在 for i val in enumerate v
  • 如何给DArray的元素设置值?

    我正在探索 Julia 的并行计算并尝试了以下方法 a dzeros 5 a 1 5 但刚刚收到此错误 setindex not defined for DArray Float64 1 Array Float64 1 嗯 我以为手册上说s
  • 如何从字符串转换为数组?

    If s 1 2 3 4 5 我们如何从中获得一个整数数组 我想返回 5 个元素Array Int64 1 1 2 3 4 5 正如 isebarn 使用的那样 split s 对于将字符串拆分为单词非常有用 默认情况下按空格拆分 juli
  • 获取参数类型的参数

    假设我定义了一个这样的类型 type Point Tx Ty end 然后我创建一个这种类型的变量 例如 a Point Int64 something 现在 我只知道我可以获得以下类型a by typeof a 那是 Point Int6
  • Julia:将数组数组转换为二维数组

    我有一个数组d包含一个浮点数组 julia gt d 99 element Array Array Float64 1 1 我正在尝试将其转换为二维数组 并且我成功地实现了我的目标 data Array Float64 length d l
  • 在 Julia 中保存和检索字典的正确方法是什么?

    我已经看到 Julia 充分解释了 MAT 文件 这些文件中的结构可以毫无问题地作为字典读取 现在我创建了自己的字典 其结构如下 String String gt Int Int Int 在每个条目上 我可以保存它writedlm它产生了一
  • 如何在 Julia 中引用结构本身

    我有这个代码 struct MyStruct text String function MyStruct text String text text do other things end end 当我写这篇文章时 我意识到朱莉娅没有认识到
  • 如何将缺失值插入到 Julia 的数据框中

    df3 10 A missing df3 15 B missing df3 15 C missing 即使 NA 也不起作用 我收到错误 方法错误 不能convertMissings Missing 类型的对象到 Int64 类型的对象 这

随机推荐

  • 我的身份池 ID 有多敏感?

    背景 我一直在开发一个消耗AWS资源 主要是API网关后面的Lambda 的前端JavaScript应用程序 API 网关资源受 IAM 保护 并且应用程序相应地使用 Cognito 提供的大部分内容 这包括一个身份池未经身份验证的身份启用
  • Ninject 每个会话单例?

    因此 我试图将用户的概念引入我的应用程序 并拥有自己的一组自定义登录例程等 工作正常 在我的模块中 我将 IUserSession 绑定到我的实现和 InSingletonScope 现在我怀疑情况确实如此 并且已经能够证明这不是正确的做法
  • 如何在python3.2中以相反的顺序读取文件而不将整个文件读取到内存? [复制]

    这个问题在这里已经有答案了 我正在使用 python3 2 解析大小为 1 到 10GB 的日志文件 需要搜索具有特定正则表达式 某种时间戳 的行 并且我想找到最后一次出现的情况 我尝试过使用 for line in reversed li
  • Outlook 日历 .Net Core Web API GetList(tokenCredential 参数不能为空。(参数 'tokenCredential'))

    我有一个与 Outlook 日历集成相关的 API 项目 通过此项目 您可以访问您的 Outlook 帐户 我想在访问日历部分后列出所有事件 我看了你的文字记录 但有些地方我不明白 我怎样才能得到这个列表 这份文件但我不明白 appsett
  • 测试周围的非零元素

    这是以下内容的以下部分 2 附加问题 获得非零邻居的平均值后 我还想测试邻居元素是否等于 小于或大于非零的平均值 如果它大于或等于 1 否则为 0 注 如果邻居在两个或多个中心的半径内 则取最小的中心平均值进行测试 0 12 9 4 9 1
  • 为什么我不断收到位置参数错误?

    有人可以向我解释一下为什么我不断收到此错误 TypeError get n nouns takes 1 positional argument but 2 were given 我已经通过查看类似的问题了解了我的问题可能出在哪里 Link
  • 如何获取结构“Elf64_Rela”中的符号名称

    include
  • JDBC CallableStatement 和 Oracle SYS_REFCURSOR IN 参数?

    和标题中说的差不多 到底该怎么做呢 基本上我需要将空 空 引用游标作为 IN 参数传递给存储过程 spring s PreparedStatementSetter setValues public void setValues Prepar
  • 在 phpstorm 中配置 css 自动完成

    使用 PHPStorm 3 0 有没有办法控制 css 文件中的自动完成功能 我已禁用 首选项 gt 编辑器 gt 代码完成 中的所有内容 但我仍然观察到以下行为 假设我会尝试输入 list 当输入 list 并按空格键添加 括号时 PHP
  • Android:在 SearchView 中输入文本时防止弹出文本字段

    你好 Android 开发者 我的 Android 系统有问题搜索视图 http developer android com reference android widget SearchView html小部件 我想做的是将 实时 文本过
  • 无法通过 API 访问 Sitecore 项目字段

    我已向现有数据模板添加了一个包含几个新字段的新部分 当以普通用户帐户登录时 这些字段会正确显示 但是 当使用 API 访问字段时 item Fields FieldName 始终返回 NULL 我尝试过的事情 发布项目和相应的数据模板 授予
  • 我可以使用 ADFS 2.0 针对 SQL Server 对某些用户进行身份验证吗?

    我一直在使用 ADFS 对 AD 中的用户进行身份验证 并使用 VS 中的声明感知模板 我们的一些用户不会在 Active Directory 中 因此我想知道是否可以配置 ADFS 来查找这些用户的 SQL Server 然后正常进行 A
  • presentPopoverFromRect 在 iOS8 beta 中不显示弹出框

    我正在将 iOS7 1 iPad 应用程序迁移到 iOS8 我刚刚下载了 Xcode 6 Beta 并在模拟器上运行了该应用程序 我注意到的第一件事是在 iOS7 1 中运行良好的弹出窗口不再工作了 我创建弹出窗口的方式是 the popo
  • Redshift 上的数字无效

    我正在尝试将一些数据从阶段加载到关系环境 但发生了一些我无法弄清楚的事情 我正在尝试运行以下查询 SELECT CAST SPLIT PART some field 2 AS BIGINT cmt par FROM public some
  • VisualVM 无​​法采样内存

    我有一个配置了 JMXRemote 参数的 tomcat 实例 本地 VisualVM 能够在 CPU 上获取采样器 但不能在内存上获取采样器 内存按钮呈灰色 并显示一条摘要 内存采样 不可用 无法连接到目标应用程序 确保应用程序在支持的
  • Eclipse 代码格式化

    我有一些混合了 JavaScript HTML 和 twig 标记的 twig 文件 有没有办法使用 Eclipse 来 hi lite 一段代码并将其格式化为 JavaScript 然后 hi lite 另一部分并将其格式化为 HTML
  • Java - 为什么重写的方法被调用两次(或者至少看起来是这样)?

    下面有这个输出 Hello World main ConstructedDerivedClass 6 0 main ConstructedDerivedClass 6 0 public class ConstructedDerivedCla
  • 部署任何 Google Action 时突然出错

    更改后 从 开发 选项卡切换到 测试 选项卡时 我的所有操作都会出错 还有几天前工作的模型 看到之后 我尝试了另一个没有任何更改的项目 并且抛出了相同的错误 有人知道发生了什么事吗 该错误不提供信息 谷歌支持团队回答了我 问题出在 Chro
  • Django 管理员不会加载某些静态文件

    我在几个 django 项目中遇到了一个奇怪的问题 我正在尝试解决它 由于某种原因 管理区域的所有静态文件都正确加载 包括 js css 和图像 但侧导航栏的 2 个文件 与其他所有文件一起位于我的静态目录中 无法加载 这些文件是 nav
  • Julia 中的“==”和“===”比较运算符有什么区别?

    有什么区别 and Julia 中的比较运算符 ChrisRackauckas 的答案就其本身而言是准确的 即对于可变对象 然而 这个问题的含义远不止于此 所以我将在这里详细说明一下 The 运算符 的别名is函数 实现 Henry Bak