尽管创建了副本,lisp函数的参数仍发生了更改

尽管创建了副本,lisp函数的参数仍发生了更改,lisp,common-lisp,Lisp,Common Lisp,我创建了一个函数,可以从嵌套列表中随机选择一个“位”,例如,((1001)(1111)(0101)),然后翻转它。如果是1,则将其设为0,反之亦然。这个函数运行得很好,但我发现它改变了原始参数,尽管我复制了一个。这是函数,最后的两个写操作演示了这个问题。如果我把((1))传递给这个,我希望看到(write-DNA-seq)打印的这个原始值,但是原始值被修改了,所以(write-DNA-seq)和(write-CDNA-seq)打印相同的东西 (defun rand-mutate (DNA-seq

我创建了一个函数,可以从嵌套列表中随机选择一个“位”,例如,
((1001)(1111)(0101))
,然后翻转它。如果是1,则将其设为0,反之亦然。这个函数运行得很好,但我发现它改变了原始参数,尽管我复制了一个。这是函数,最后的两个写操作演示了这个问题。如果我把
((1))
传递给这个,我希望看到
(write-DNA-seq)
打印的这个原始值,但是原始值被修改了,所以
(write-DNA-seq)
(write-CDNA-seq)
打印相同的东西

(defun rand-mutate (DNA-seq)
  (let ((CDNA-seq (copy-list DNA-seq)))
    (let ((gene (random-range 0 (length CDNA-seq))))
      (let ((base (random-range 0 (length (nth gene CDNA-seq)))))
        (cond ((= (nth base (nth gene CDNA-seq)) 0) (setf (nth base (nth gene CDNA-seq)) 1))
              (t (setf (nth base (nth gene CDNA-seq)) 0))) (write DNA-seq)(write CDNA-seq)))))

复制列表
是一个浅层副本,它只复制最外层的列表,而不复制每个元素引用的列表。使用
复制树
执行深度复制


你可能会发现这很有用。谢谢你迅速的回答,我怀疑这可能是我错过的一些简单的东西。这就解决了!
(defvar list '((1 0 0 1)))
(defvar list-copy (copy-list list))
(defvar list-copy-tree (copy-tree list))
(eq list list-copy) => NIL
(eq (car list) (car list-copy)) => T
(eq (car list) (car list-copy-tree)) => NIL