First of all, they may seem the same, but this is not the case:
(class (list [1 2 3])) => clojure.lang.PersistentList
(class (seq [1 2 3])) => clojure.lang.PersistentVector$ChunkedSeq
listusually an implementation, while seqalways an abstraction.
The differences between sections and lists are in the following three aspects, as outlined in Clojure Programming
1. getting the seq length can be expensive:
eg. from Clojure Programming
(let [s (range 1e6)]
(time (count s))) => 1000000
; "Elapsed time: 147.661 msecs"
(let [s (apply list (range 1e6))]
(time (count s))) => 1000000
; "Elapsed time: 0.03 msecs
, . seq , count.
2. seqs , .
(class (range)) => clojure.lang.LazySeq
(class (apply list (range))) ;cannot be evaluated
; "java.lang.OutOfMemoryError: GC overhead limit exceeded"
3. seqs , , .
, seqs ( ):
(class (seq '(1 2 3))) => clojure.lang.PersistentList
seq cons. cons conj.