在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来讨论一些可用的库和方法。