2009-11-14 122 views
3

標題不言自明。我如何從另一個列表Y(相同的結構)創建一個新的列表X,但結果列表指向內存區域的其他地方,實際上是另一個對象?我試着用make-list :initial-element Y或附加到一個空的列表,但我仍然得到相同的對象。謝謝!如何製作新的列表以指向其他地方,Lisp

回答

3

你可能想要使用COPY-LIST。

+0

是的,就是這樣。如果我在新列表中設置了一個位置,第一個將不會被更改。謝謝。 – PCManticore 2009-11-14 15:40:48

+0

事實上,如果我使用列表中的列表,問題仍然存在。例如,給定a((1 2 3)(4 5 6))和b作爲a的副本,則setf(nth 0(nth 0 b))「4」將更改這兩個列表。 – PCManticore 2009-11-14 15:44:47

+0

注意最有利的評論,和/或閱讀HyperSpec。 COPY-LIST只複製一個* list * - 它爲頂層創建新的conses,然後只指向舊數據(如果舊數據是指針,就像另一個cons,將在兩個列表之間共享) 。 COPY-TREE將通過您的結構遞歸併在各個層次上創建新的concon,但其他類型的複雜數據結構仍可能被共享。要做到這一點*完全*你必須編寫自己的函數,因爲沒有像通用複製函數那樣的東西。 – Xanthir 2009-11-19 15:40:38

12

Common Lisp的

使用COPY-LIST複製第一列表級別。

使用COPY-TREE要複製一個conses樹,多級列表將被複制到所有級別。

COPY-TREE和COPY-LIST都只會複製conses而沒有別的。列表中的內容保持不變(意味着EQL,而不是EQ)。

有關這些功能和相關功能,請參閱Common Lisp HyperSpec的The Conses Dictionary

0

我的副本列表(使用sbcl)工作。

REPL:

(defvar a '((1 2 3) (4 5 6))) 

(defvar b (copy-tree a)) 

(setf (nth 0 (nth 0 b)) "4") 

a 

; ((1 2 3) (4 5 6)) is returned 

b 

;(("4" 2 3) (4 5 6)) is returned 

也許如果你給了我們更多的來源,我們可以提供幫助。

相關問題