我刚刚开始使用Common Lisp,我不知道为什么下面的代码返回3:
(progn
(setq lista '(1 2))
(setq listb lista)
(setf (nth 1 listb) 3)
(nth 1 lista))
请帮帮我吗?
答案 0 :(得分:2)
Setq
不会复制内容。在(setq listb lista)
之后,两个名称都指向同一个列表。当您使用一个名称修改它时,它也会在另一个名称下更改。
如果您要创建副本,请使用copy-list
,copy-tree
,copy-alist
或copy-seq
(请参阅CLHS)。另外,不要修改文字数据(quote
('
)是文字数据。)
(let* ((list-a (list 1 2))
(list-b (copy-list list-a)))
(setf (nth 1 list-b) 3)
(nth 1 list-a))