在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是数组的真实、独立副本(“deep copy”),则需要分配一个新数组并将a的元素复制到其中一种方法是对一维数组使用copy-seq函数。对于更奇特的数组,您还可以查看这个question about how to copy 2d arrays来讨论一些可用的库和方法。

09-11 19:23