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 1.0 中离线安装 julia 包?

    我有自己的 Julia 包 在 Julia 0 6 上运行良好 当我尝试升级到 Julia 1 0 时 我发现在 Julia 1 0 中添加我自己的包更加困难 我不能把它放在 pkg dir 下 在我的情况下 该包只是我本地磁盘上的几个文件
  • 相当于 Python 中 Julia 中的“with”?

    Julia 有与 Python 相当的东西吗 with 也许作为一个宏 这非常有用 例如 自动关闭打开的文件 Use a do堵塞 关于 do 块的文档是here https en wikibooks org wiki Introducin
  • Julia 多次调度失败

    v06 我想写一个需要 2 到 3 个参数的签名 第一个是整数或整数向量 第二个是整数向量或整数矩阵 第三个是整数向量或未指定 我第一次尝试是这样的 function foo a Union Integer Vector Integer b
  • Julia 自定义类型分配

    我尝试从 Julia 中的自定义类型分配多个元素 但是我不知道该怎么做 或者换句话说 我想重载赋值运算符以返回该类型中包含的所有元素的元组 这是所需的行为 type foo a b end a b foo 1 2 a gt 1 这是错误消息
  • Julia:生成唯一的随机整数数组

    我正在尝试创建 10 个唯一随机整数的元素数组 但是我无法创建具有唯一值的数组 Julia 中是否有类似 Python 的东西样本函数 https docs python org 2 library random html random s
  • Julia 似乎没有使用字符串来执行插值

    官方文档指出 连接和字符串插值调用string 将对象转换为字符串形式 然而 以下最小工作示例似乎证明了其他情况 type MyType x Int end import Base string Base string m MyType w
  • 离散连续概率分布

    认识到这可能是一个统计问题和编码问题 假设我使用 Distributions jl 创建了一个正态分布 using Distributions mydist Normal 0 0 2 有没有一种好的 直接的方法可以离散化这样的分布以获得 P
  • 有没有办法在 writetable() 中使用字符串作为分隔符 - Julia

    当使用 writetable 将数据帧写入文件时 我希望能够将分隔符设为空格然后逗号 即 作为分隔符 我知道 writetable 只能选择将单个字符作为分隔符参数 是否有可能的解决方法能够将字符串作为分隔符 或者 是否可以简单地在数据框中
  • 埃拉托斯特尼筛法速度比较:Python 与 Julia

    所以我有一个用 Python 和 Julia 编写的 Eratosthenes 函数的小筛子 并且我正在比较运行时间 这是Python代码 import time def get primes n numbers set range n 1
  • 在 Julia 中,有没有办法让“现在”(至少)达到毫秒精度?

    通常 要了解代码中发生的情况 您需要高精度时间来分析您的应用程序或出于其他原因 显然 现在 https stackoverflow com questions 32407509 how to get the milliseconds fro
  • 带有 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
  • 如何给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
  • 是否可以从 Julia 调用 Python 函数并返回其结果?

    我正在使用 Python 从网络上抓取数据 我想使用这些数据在 Julia 中运行计算 是否可以在 Julia 中调用该函数并返回其结果 或者我最好直接导出到 CSV 并以这种方式加载数据 绝对地 看PyCall jl https gith
  • 如何一步步执行Julia脚本?

    Julia 有什么方法可以在 REPL 中逐步执行现有脚本 同时能够修改 绘制数组吗 以Matlab调试为例 注意 我特别要求 0 4 版本 希望能够实现新的调试系统 您有几个选择 The 调试包 https github com toiv
  • 使用 Julia Plots 访问后端特定功能

    Plots简单而强大 但有时我想对情节的各个元素有更多的控制 以微调其外观 是否可以直接更新后端的绘图对象 例如 对于默认的pyplot后端 我试过了 using Plots p plot sin p o axes 1 xaxis set
  • 如何使用 Julia 查找矩阵中的连通分量

    假设我有以下矩阵 此处用 Julia 语言定义 mat 1 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 将一组值为 1 的相邻元素视为一个 分量 如何识别该矩阵有 2 个分量以及每个分量由哪些顶点组成 对于矩
  • 调试 Julia v.0.6

    我克隆了一个存储库 https github com XiaojingGeorgeZhang OBCA tree master AutonomousParking在 Julia 0 5 和 0 6 中进行了测试 我之前使用的是最新的 Jul
  • Julia:将 1x1 数组从内积转换为数字

    从内积运算而不是 1x1 数组中获取数字的最佳方法是什么 还有比这更好的方法吗 1 2 3 4 5 6 1 如果可能的话 我不会手动进行内积 我会使用dot i e dot 1 2 3 4 5 6 我注意到你实际上并没有向量 相反你有1x3

随机推荐

  • 我的身份池 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