我想创建一个已经存在的数组的副本,但我希望能够更改其中一个数组的值,而不是更改另一个数组的值。

(setf arayONE (make-array(list 2 2)))
(setf arayTWO arayONE)

(setf (aref arayONE 1 1) 2)  ; this will change both arayONE and arayTWO values

我也尝试用(let….)语句传递值,但给出了相同的答案。。
谢谢你问我这个新问题。

最佳答案

当您执行(setf arayTWO arayONE)时,实际上是给同一个数组指定了两个不同的名称,因为setf不执行任何复制操作,而只是将arayTWO的值赋给变量arayONE,该值是对数组的引用。
因此,您必须显式地复制数组,但由于在公共Lisp中没有用于复制数组的基元函数,因此您必须自己编写它或使用某些库(如Alexandria)提供的函数。
例如,对于本例的简单副本,您可以编写如下内容:

(setf arayTWO (make-array (array-dimensions arayONE)))
(dotimes (i (array-total-size arayONE))
     (setf (row-major-aref arayTWO i)
           (row-major-aref arayONE i)))

对于一个更通用的函数,它适用于各种类型的数组,包括填充指针、可调整性等等,您可以看看这个答案:How do you copy an array in common lisp?

10-08 09:13