You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:22:28