Common Lisp中setf行为不符合预期,请求协助解析代码问题
为什么你的Common Lisp代码返回3?
嘿,这个问题刚好踩中了Common Lisp里列表操作的核心概念——变量存储的是对列表对象的引用,而非列表的副本,我来一步步拆解给你看:
我们逐行分析这段代码:
(setq lista '(1 2)):创建了一个列表(1 2),变量lista现在保存的是这个列表在内存中的地址(也就是指向它的引用)。(setq listb lista):这一步并没有复制lista指向的列表,只是把lista里的引用原封不动地赋值给了listb。现在lista和listb其实是指向同一个列表对象的两个变量,就像两把钥匙开同一扇门。(setf (nth 1 listb) 3):nth 1 listb会定位到列表的第二个元素(Common Lisp里索引从0开始),setf则直接修改这个位置的内容。因为listb和lista共享同一个列表,所以这次修改会直接改变那个唯一的列表。(nth 1 lista):现在去取lista的第二个元素,当然就是刚刚被修改成的3了。
如果想让listb成为独立的列表(修改它不影响lista),你需要显式复制列表,比如用copy-list函数:
(progn (setq lista '(1 2)) (setq listb (copy-list lista)) ; 这里做了列表拷贝 (setf (nth 1 listb) 3) (nth 1 lista)) ; 现在会返回2,因为两个列表是独立的
内容的提问来源于stack exchange,提问作者ume
相关产品推荐
相关产品推荐

