像這樣:如何在計劃中追加像Python?
> (my-append (list 1 2) 3)
'(1 2 3)
我知道append
在racket
實際上是連接兩個列表。 而cons
只是一個元素添加到列表中的頭,而不是尾
有沒有人有這個想法?
像這樣:如何在計劃中追加像Python?
> (my-append (list 1 2) 3)
'(1 2 3)
我知道append
在racket
實際上是連接兩個列表。 而cons
只是一個元素添加到列表中的頭,而不是尾
有沒有人有這個想法?
在Pyton,該append()
方法修改就地名單:
lst = [1, 2]
lst.append(3)
lst
=> [1, 2, 3]
球拍的列表是在默認情況下不可變的,最接近於就地append()
要求您使用可變的列表,你必須元素收拾附加在它自己的列表中:
(require scheme/mpair)
(define lst (mlist 1 2))
(mappend! lst (mlist 3))
lst
=> (mlist 1 2 3)
注意,使用不可變列出與append
過程將產生一個新的列表,而原始列表不變 - 所以它不會是「像Python」:
(define lst (list 1 2))
(append lst (list 3)) ; this returns the new list '(1 2 3)
lst
=> (list 1 2)
事實上,方案的append
程序的行爲就像列表之間Python的+
操作:
lst = [1, 2]
lst + [3] # this returns the new list [1, 2, 3]
lst
=> [1, 2]
試想想它,Python的append()
威力^ h一個誤導的名字 - 在大多數函數式編程語言中,附加操作總是在兩個列表之間定義,而在Python中它是列表和元素之間的操作。也許add()
將會是一個更好的名字,比如Java的add()
操作的List
接口。
我不知道你的意思「追加像巨蟒」是什麼,但如果你想要的是插入在列表的最後一個新的元素,你可以使用這個:
(define (my-append lst el)
(append lst (list el)))
如果您在Racket中,您可能需要查看可生長的矢量庫(data/gvector)。這提供了一種容器類型,它支持您習慣使用Python可增長列表的許多功能。
例子:
#lang racket
(require data/gvector)
(define lst (gvector 1 2))
(gvector-add! lst 3)
(for ([elt lst]) (printf "I see: ~s\n" elt))
否則,你的問題最終減少了:我怎麼做一成不變的鏈表的工作就像可變的順序分配的數組?這不會很好:數據類型因不同原因而不同。
Python的追加方法是支持自動增長的向量狀數據結構上的變異。需要注意的是,Python使用的術語「list」應該被定義爲「可生長的,可變的向量」。 – dyoo