我想创建一个已经存在的数组的副本,但我希望能够更改其中一个数组的值,而不是更改另一个数组的值。
(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?