gpt4 book ai didi

lisp - setf 似乎在 aref 给出时改变了它的两个参数

转载 作者:太空宇宙 更新时间:2023-11-03 18:53:42 26 4
gpt4 key购买 nike

在 Lisp 中,我定义了一个数组 a,然后让 b 等于 a。我现在想重新定义 b 的条目,使其等于 a 中的另一个条目,如下所示:

(setf a (make-array '(2 2) :initial-contents '((1 2) (3 4))))
(setf b a)
(setf (aref b 0 0) (aref a 0 1))

现在,b 将是 #2A((2 2) (3 4)),这很好。但令我困惑的是 a 现在也是 #2A((2 2) (3 4))

我的问题是:为什么将 setf 应用于 b 的条目也会更改 a?我可以通过使用 (setf x (aref a 0 1)) 引入一个中间变量然后应用 (setf (aref b 0 0) x) 来解决这个问题,但是这对我来说似乎是一个奇怪的解决方法。

最佳答案

您在第二行中的(setf b a) 执行其他语言中有时称为浅拷贝 的操作。也就是说,b 不会成为数组 a 的独立副本,而是成为完全相同数组的另一个名称。因此,当您修改 b 时,您也在修改 a

如果您希望 b 成为数组的真实、独立副本(“深拷贝”),那么您需要分配一个新数组并复制 a 的元素 进去。对于一维数组,一种方法是使用 copy-seq功能。对于更高级的阵列,您还可以查看此 question about how to copy 2d arrays其中讨论了一些可用的库和方法。

关于lisp - setf 似乎在 aref 给出时改变了它的两个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28552141/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com