如何复制列表而不共享结构?

时间:2013-08-11 21:09:21

标签: common-lisp

哇,我完全不理解这一点!

我有一个列表,L1。我想复制一份L2,以便在我修改L2时,L1保持不变。我认为这是copy-seq的用途,但它没有达到预期的效果。

(defun tcopy ()
  (let ((seq1 nil)
        (seq2 nil))
    (setf seq1 (list (list 11 22) (list 33 44 55)))
    (setf seq2 (copy-seq seq1))        
    (format t "before -- s1: ~a s2: ~a~%" seq1 seq2)
    (setf (nth 1 (nth 1 seq2)) 99)
    (format t "after --  s1: ~a s2: ~a~%" seq1 seq2)))

输出:

? (tcopy)
before -- s1: ((11 22) (33 44 55)) s2: ((11 22) (33 44 55))
after --  s1: ((11 22) (33 99 55)) s2: ((11 22) (33 99 55)) ; Undesired: s1 is modified
NIL
? 

我也尝试了以下内容:

;(setf seq2 (copy-seq seq1))
(setf seq2 (reduce #'cons seg1 :from-end t :initial-value nil))

它给出了相同的结果。 Lisp-n00b,在这里;我错过了什么?!

谢谢!

1 个答案:

答案 0 :(得分:11)

COPY-SEQ仅复制顶级序列。没有任何后续序列。 (COPY-LIST的行为方式相同。)

COPY-TREE复制一张cons细胞树。因此,它还将复制列表清单......