【问题标题】:Argument to lisp function changed despite creating a copy尽管创建了副本,但 lisp 函数的参数发生了变化
【发布时间】:2014-12-31 19:03:54
【问题描述】:

我创建了一个函数来从嵌套列表中随机选择一个“位”,例如((1 0 0 1) (1 1 1 1) (0 1 0 1)),然后翻转它。如果是 1,则将其设为 0,反之亦然。该函数运行良好,但我发现尽管我制作了副本,但它会改变原始参数。这里是函数,最后写的两篇演示了这个问题。如果我将((1 1 1 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)))))

【问题讨论】:

标签: lisp common-lisp


【解决方案1】:

copy-list 是一个 副本,它只复制最外层的列表,而不是每个元素所引用的列表。使用copy-tree 执行复制。

(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

【讨论】:

  • 感谢您的快速回答,我怀疑这可能是我遗漏的一些简单事情。解决了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-02
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 1970-01-01
  • 2021-01-26
相关资源
最近更新 更多