在 Lisp 中复制和修改列表列表的头部

2024-01-09

我正在学习 Lisp。我希望将一个新列表添加到列表列表中,例如 ((1 1 1) (0 0 0)),其中该列表集合的新头是根据前一个头计算的。

这是我在 Slimv 的 REPL 环境中使用 sbcl 进行的尝试:

> (defvar *ll* (list (list 1 1 1) (list 0 0 0)))
*LL*
> *ll*
((1 1 1) (0 0 0))
> (push (car *ll*) *ll*)
((1 1 1) (1 1 1) (0 0 0))
> (setf (nth 2 (car *ll*)) 2)
2
> *ll*
((1 1 2) (1 1 2) (0 0 0))

如上所示,我只想修改第一个列表的最后一个元素,但不知怎的,第二个列表的最后一个元素也被更改了。

我注意到,如果我推入一个全新的列表,那么结果会有所不同:

> (defvar *lll* (list (list 1 1 1) (list 0 0 0)))
*LLL*
> (push '(1 1 1) *lll*)
((1 1 1) (1 1 1) (0 0 0))
> (setf (nth 2 (car *lll*)) 2)
2
> *lll*
((1 1 2) (1 1 1) (0 0 0))

我想知道是什么导致了这些不同的结果,以及如何实现“将新列表添加到列表列表中,其中结果列表集合的新头是根据前一个头计算的”的结果。谢谢!


(car *ll*) and (cadr *ll*)是同一个列表

> (defvar *ll* (list (list 1 1 1) (list 0 0 0)))
*LL*
> *ll*
((1 1 1) (0 0 0))
> (push (car *ll*) *ll*)
((1 1 1) (1 1 1) (0 0 0))
> (setf (nth 2 (car *ll*)) 2)
2
> *ll*
((1 1 2) (1 1 2) (0 0 0))

如上所示,我只想修改第一个的最后一个元素 列表,但不知何故,第二个列表的最后一个元素也是 改变了。

那里只有一个对象,而您修改了它。这与某种结构化数据类型没有什么不同(实际上,什么是 cons 单元,而是只有两个字段的结构化数据类型)。如果你有一个人员列表,然后你再次将第一个人添加到列表中,那么仍然只有一个人;此人仅出现在列表中的两个位置。如果您更改此人的姓名,您会在两个地方看到它。如果您设置,您实际上可以看到共享结构*print-circle* http://www.lispworks.com/documentation/HyperSpec/Body/v_pr_cir.htm to t.

CL-USER> (defvar *ll* (list (list 1 1 1) (list 0 0 0)))
*LL*
CL-USER> *ll*
((1 1 1) (0 0 0))
CL-USER> (push (car *ll*) *ll*)
((1 1 1) (1 1 1) (0 0 0))
CL-USER> *ll*
((1 1 1) (1 1 1) (0 0 0))
CL-USER> (setf *print-circle* t)
T
CL-USER> *ll*
(#1=(1 1 1) #1# (0 0 0))

符号使用#1=… and #1#表明sameobject 是列表的第一个和第二个元素。

如果您想要副本,请制作副本

我希望将一个新列表添加到列表列表中,例如((1 1 1) (0 0 0)), 其中该列表集合的新头是根据 前一个头。 ……

> (push (car *ll*) *ll*)
((1 1 1) (1 1 1) (0 0 0))

你说你想添加一个new列表到列表的列表,但您没有添加new列表;你正在添加(car *ll*)这是您一开始创建的列表(list 1 1 1)。如果您想复制列表,则需要显式复制它,例如,使用copy-list http://www.lispworks.com/documentation/HyperSpec/Body/f_cp_lis.htm:

> (push (copy-list (car *ll*)) *ll*)
((1 1 1) (1 1 1) (0 0 0))

不要修改文字数据!

顺便说一句,您在第二个代码块中所做的实际上是未定义的行为,因为您正在修改literal list '(1 1 1).

> (defvar *lll* (list (list 1 1 1) (list 0 0 0)))
*LLL*
> (push '(1 1 1) *lll*)            ; '(1 1 1) is literal data.
((1 1 1) (1 1 1) (0 0 0))
> (setf (nth 2 (car *lll*)) 2)     ; (car *lll*) is literal data, and you're modifying it!
2
> *lll*
((1 1 2) (1 1 1) (0 0 0))

See 我的答案 https://stackoverflow.com/a/18790523/1281433 to 意外的数据持久性 https://stackoverflow.com/q/18790192/1281433详细了解为什么这可能会出现问题。

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

在 Lisp 中复制和修改列表列表的头部 的相关文章

  • Python - 在和不在列表中语法错误

    我正在尝试从另一个现有的浮点数列表构建一个新的浮点数列表 通过示例更容易识别第一个列表的预期内容 price list 39 99 74 99 24 99 49 99 预期的后期功能 print new price list gt gt 2
  • Python 字符串到 SQL IN 参数的列表

    我在 python 中有这个查询 ssim group S1200 S1300 query select WIPMessageCnt from waferdata where recipename in s and equipment an
  • 解决斐波那契数列的 Lisp 方法

    我想尝试学习 Lisp 但很快就放弃了 我想我会再试一次 我正在看 求 400 万以下所有偶数斐波那契数的总和 我写了下面的代码 它可以工作 但是很丑陋 其中最主要的是它太慢了 因为它一直在进行简单的递归 当我用 Python 编写这个程序
  • R 数据框到嵌套列表

    我想将这种格式的数据帧 tbl 转换为以下嵌套列表 tbllst library tidyr tbl lt tribble Col1 Col2 Col3 Var1 Var1 1 Var1 1 1 Var1 Var1 1 Var1 1 2 V
  • 如何在 Python 中从平面列表构建嵌套列表? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有一个简单的列表 例如 flat 1 1 1 1 1 1 1 2 2 2 1 2 2 3 我需要转换为嵌套列表 其中每个级别 破折号后跟数
  • Pandas DataFrame 中多列的映射方法

    我有一个 Pandas 数据框 其中的值是列表 import pandas as pd DF pd DataFrame X 1 5 1 2 Y 1 2 5 1 3 5 DF X Y 0 1 5 1 2 5 1 1 2 1 3 5 我想检查
  • 如何从字典列表中查找键的值?

    如何从字典列表中获取给定键的值 mylist powerpoint color blue client name Sport Parents Regrouped sort order ascending chart layout 1 cha
  • Java:如何实现3和?

    我正在研究 3 Sum 来自己实现它 并遇到了以下规则的实现 给定一个由 n 个整数组成的数组 S S 中是否存在满足 a b c 0 的元素 a b c 查找数组中所有总和为零的唯一三元组 注意 三元组 a b c 中的元素必须按非降序排
  • List.Clear() 在 C# 中是如何实现的?

    我假设它使用数组来实现 List 怎么List Clear 实施的 它实际上清理了数组还是只是为此列表创建了一个新数组 public class List private Array array public void Clear1 arr
  • 如何将 Pandas Dataframe 中的字符串转换为字符列表或数组?

    我有一个名为的数据框data 其中一列包含字符串 我想从字符串中提取字符 因为我的目标是对它们进行一次性编码并使之可用于分类 包含字符串的列存储在预测因子如下 predictors pd DataFrame data columns Seq
  • Java 阻止列表实现

    我在 SO 和 Google 上搜索了这个问题的答案 但到目前为止找不到合适的解决方案 我目前正在研究图形路由问题中的 LayerManager 管理器负责提供和重置一组固定的层 我想使用阻止列表来实现消费者 生产者模式 以便只要没有可用的
  • 使用 sapply 的列表和矩阵

    我有一个也许是基本的问题 我在网上搜索过 我在读取文件时遇到问题 尽管如此 我还是按照 Konrad的建议设法读取了我的文件 我很欣赏这一点 How to get R to read in files from multiple subdi
  • 使用 Linq 返回具有最大计数的列表

    使用 C 和 Linq 如何返回具有最大大小 计数的 List 我假设您有一个名为的列表集合lists并且您想要返回此集合中元素最多的列表 如果是这样 请尝试以下操作 var listWithLargestCount lists Order
  • 为什么在 emacs-lisp 中的函数参数之前使用#'?

    我熟悉 Emacs Lisp 但不熟悉 Common 或任何其他 Lisp 一些 Lisp 程序员建议 例如emacs 的基本功能 https stackoverflow com questions 17076646 a basic fun
  • Python-使用元组作为列表索引[重复]

    这个问题在这里已经有答案了 我有一个元组列表 tuples list 1 0 2 3 3 2 2 0 我想访问二维数组的元素a例如 使用其中一些元组 for i in range 3 print a tuples list i 应该输出的值
  • 在不同进程之间共享列表?

    我有以下问题 我编写了一个函数 它将列表作为输入 并为列表中的每个元素创建一个字典 然后我想将这本字典附加到一个新列表中 这样我就得到了一个字典列表 我正在尝试为此生成多个进程 我的问题是 我希望不同的进程访问由其他进程更新的字典列表 例如
  • 如何将列表转换为元组列表?

    我想转换 z z a z z a a z to z 2 a 1 z 2 a 2 z 1 我该怎么做 所以 我需要累积以前的值 它的计数器和元组列表 我已创建记录 record acc previous counter tuples 重新定义
  • 学习 Lisp 的资源 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • R:ifelse 中的字符串列表

    我正在寻找与 MySQL 中的 where var in 语句类似的东西 我的代码如下 data lt data frame id 10001 10030 cc1 rep c a b c 10 attach data data new lt
  • 查找列表中项目的索引

    给定一个列表 foo bar baz 和列表中的一个项目 bar 如何获取它的索引1 gt gt gt foo bar baz index bar 1 See 文档 https docs python org tutorial datast

随机推荐

  • 处理推文时使用 JSON 或正则表达式

    哪种方法更快 使用 JSON 解析器 python 2 6 或正则表达式来获取相关数据 由于数据量巨大 我认为使用一种方法与其他方法相比在时间上会有很大差异 假设你在问什么 我相信您会问 通过反序列化序列化 JSON 字符串或通过正则表达式
  • 返回 R 中别名系数的 VIF

    我想知道是否有人可以帮助我解决以下问题 当我在各种解释变量之间进行 VIF 分析时 会出现以下错误消息 test lt vif lm Spring Autumn Oct Nov Dec Jan Feb Mar Apr May Jun Jul
  • 重写 HashSet 的 Contains 方法

    有人能告诉我如何重写 HashSet 的 contains 方法以使用正则表达式匹配而不是仅使用 equals 吗 或者 如果不覆盖 我如何添加一个方法来使用正则表达式模式 基本上 我希望能够在包含字符串的 HashSet 上运行正则表达式
  • C# - 使用 HTMLAgilityPack 获取 JavaScript 变量值

    我目前有 2 个 JavaScript 变量 需要从中检索值 HTML 由一系列没有 id name 属性的嵌套 DIV 组成 是否可以使用 HTMLAgilityPack 从这些变量中检索数据 如果是这样 我将如何去做 如果不是需要什么
  • 如何在magento中添加密件抄送或抄送

    我不知道如何在以下编码中添加抄送或密件抄送 我尝试了密件抄送 但邮件无法发送 请有人帮忙 代码是 data array name gt username to user id gt to userid email gt email tele
  • 在 MyEclipse 中开发 Maven 战争应用程序值得吗?

    我的组织已做出上层决定 将 Maven 作为 Java 项目的标准构建工具 我的任务是帮助我们的本地团队将项目迁移到 Maven MyEclipse IDE 是正在发挥作用的核心工具之一 MyEclipse 似乎与 Maven 团队有着一段
  • 蟒蛇熊猫。日期对象由单独的列分割。

    我在Python pandas 中将日期写为 1 31 2010 为了应用线性回归 我想要 3 个单独的变量 天数 月数 年数 将 pandas 中包含日期的列分成 3 列的方法是什么 另一个问题是将天数相同但分为 3 组 1 10 11
  • 当测试一起运行时,所有测试中使用的外部库模拟补丁不起作用

    我正在使用 Python 的模拟库和单元测试 我正在为一个类编写单元测试 该类在其方法之一中使用外部库的函数 根据情况 该函数返回不同的值 假设我想测试 A 类 from external library import function f
  • Ubuntu 服务器上的 PHP PDO 到 MS SQL Server

    我正在尝试使用 PDO 连接到 MS SQL Server 我尝试过使用这个 db new PDO sqlsrv server server database databaseName username password 我读到不再支持 s
  • 如何将 jQuery 对象转换为字符串?

    如何将 jQuery 对象转换为字符串 我假设您需要完整的 HTML 字符串 如果是这样的话 类似这样的事情就可以解决问题 div append item of interest clone html 这有更深入的解释here http j
  • 为Excel饼图添加数据标签

    我正在绘制带有一些数据的饼图 private void DrawFractionChart Excel Worksheet activeSheet Excel ChartObjects xlCharts Excel Range xRange
  • java android - 如何将资源中的html设置为TextView?

    是否有可能将 html 从 res raw 加载到 TextView 中 我知道我可以使用 WebView 但是该死的透明度并不总是有效 并非在每个设备上 myTextView setText Html fromHtml readTxt 此
  • 开源的基于规则的模式匹配/信息提取框架? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在购买一个开源框架 用于编写自然语言语法规则 以通过注释进行模式匹配 您可以将其视为正则表达式 但
  • Docker Compose 复制一个文件夹,但不复制另一个文件夹

    我还在学习 Docker 这种情况让我很困惑 Docker 会将一个文件夹复制到映像 容器 但它会跳过另一个文件夹 我不明白为什么 Docker 桌面 4 X Ubuntu Linux 容器 NET 5 0 Blazor 应用程序 因此在应
  • 使用 Java 对所有字段进行 MongoDB 文本索引

    我想在 MongoDB 中的所有字段上创建文本索引 我知道可以这样做 db collection ensureIndex text name TextIndex 但我想在我的 Java 程序中创建这个索引 我尝试过这个 collection
  • 在 ICE 上指定最大高度的 Flexbox 子溢出父级

    我有一个父元素 其中包含两个子元素 这两个子元素使用 Flexbox 显示在彼此的顶部 该父元素的 max height 属性设置为某个值 因此 只要内容很短 父元素就应该保持很小 并且随着内容的增长 父元素也随之增长 直到达到其最大高度
  • 使用 RSelenium 通过 for 循环从 .asp 网页收集表数据

    我正在尝试收集印度村庄一级的人口普查数据http www censusindia gov in Census Data 2001 Village Directory View data Village Profile aspx http w
  • 在Python中从二进制文件中读取4字节整数

    我有一些包含 4 字节整数的二进制文件集 有些可能很大 100MB 谁能提供一个代码片段来展示如何提取每个 4 字节整数直到到达文件末尾 使用Python 2 7 Thanks 你可以使用struct unpack http docs py
  • Bootstrap 的侧边栏带有固定页脚和可滚动 div

    As you see from the picture below the part of sidebar where I have scrollable TreeView didnt work also I need to have fi
  • 在 Lisp 中复制和修改列表列表的头部

    我正在学习 Lisp 我希望将一个新列表添加到列表列表中 例如 1 1 1 0 0 0 其中该列表集合的新头是根据前一个头计算的 这是我在 Slimv 的 REPL 环境中使用 sbcl 进行的尝试 gt defvar ll list li