gpt4 book ai didi

list - Lisp:如何停止不需要的多个列表变量的重新分配

转载 作者:太空宇宙 更新时间:2023-11-03 18:57:48 26 4
gpt4 key购买 nike

在 lisp 中,我有以下示例代码:

(setf list1 '("a" "b" "c" )) 
(setf list2 '())
(setf list2 list1)
(setf (nth 2 list1) "d")
(princ list1)
(princ list2)

我想要的结果是:

(a b d)(a b c)

但它重新分配了“list1”和“list2”的第 n 个元素,导致:

(a b d)(a b d) 

我假设这是因为我在代码的前面将 list2 设置为等于 list1,但通常当您将变量设置为彼此相等时,它们不会那样改变。这里发生了什么?

最佳答案

当您在 lisp 中分配列表时,不会发生复制。您问题的第三行:

(setf list2 list1)

不复制列表,而是将 list2 设置为也引用与 list1 相同的 cons 单元格。如果您想要一个新列表,请改用 copy-list :

(setf list2 (copy-list list1))

这会将 list2 设置为 list1 的浅拷贝;也就是说list1和list2中CONS单元格的所有CAR都是same .

关于list - Lisp:如何停止不需要的多个列表变量的重新分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33114338/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com