在公共Lisp中交换列表元素

在公共Lisp中交换列表元素,lisp,common-lisp,Lisp,Common Lisp,我需要交换给定两个位置(I,j)的列表元素,以实现TSP的2-opt启发式,并建议使用rotatef 然而,当我尝试使用它时,我无法理解它的行为 这段代码让我头疼: (setq loop '(A B C D E F)) > (A B C D E F) ;; Original copy saved in loop (setq new_tour loop) (format t "ORIGINAL LOOP: " loop) > LOOP: (A B C D E F) (format

我需要交换给定两个位置(I,j)的列表元素,以实现TSP的2-opt启发式,并建议使用
rotatef

然而,当我尝试使用它时,我无法理解它的行为

这段代码让我头疼:

(setq loop '(A B C D E F))
> (A B C D E F)

;; Original copy saved in loop
(setq new_tour loop)

(format t "ORIGINAL LOOP: " loop)
> LOOP: (A B C D E F)

(format t "NEW_TOUR: " new_tour)
> NEW_TOUR: (A B C D E F)

(rotatef (nth 0 new_tour) (nth 1 new_tour))
(format t "NEW_TOUR IS NOW: ~a~%" new_tour)
> NEW_TOUR IS NOW: (B A C D E F)

(format t "ORIGINAL LOOP IS NOW: ~a~%" loop)
> ORIGINAL LOOP IS NOW: (B A C D E F)

为什么
rotatef
也会修改“循环”列表?有没有一种方法可以在不丢失原始列表(
loop
)的情况下交换
new\u-tour
的元素?

复制
loop
使用

(setq new_tour (copy-list loop))

要复制
循环
请使用

(setq new_tour (copy-list loop))

你没有复印。您的代码中只有一个列表。您有两个变量指向同一个文本列表。由于您的问题与AI或启发式无关,我已删除这些标记…您没有复制。您的代码中只有一个列表。您有两个变量指向同一个文本列表。由于您的问题与AI或启发式无关,我已删除这些标记。。。