The first, [:], is creating a slice (normally often used for getting just part of a list), which happens to contain the entire list, and thus is effectively a copy of the list. The second, list(), is using the actual list type constructor to create a new list which has contents equal to the first list.
The first way works for a list or a string; the second way only works for a list, because slice assignment isn't allowed for strings. Other than that I think the only difference is speed: it looks like it's a little faster the first way. Try it yourself with timeit.timeit () or preferably timeit.repeat ().
If your list of lists comes from a nested list comprehension, the problem can be solved more simply/directly by fixing the comprehension; please see How can I get a flat result from a list comprehension instead of a nested list?. The most popular solutions here generally only flatten one "level" of the nested list. See Flatten an irregular (arbitrarily nested) list of lists for solutions that ...
@Sandy Chapman: List.of does return some ImmutableList type, its actual name is just a non-public implementation detail. If it was public and someone cast it to List again, where was the difference? Where is the difference to Arrays.asList, which returns a non-public List implementation, that throws an exception when attempting add or remove, or the list returned by Collections ...
A List uses an internal array to handle its data, and automatically resizes the array when adding more elements to the List than its current capacity, which makes it more easy to use than an array, where you need to know the capacity beforehand.
List is an Interface, you cannot instantiate an Interface, because interface is a convention, what methods should have your classes. In order to instantiate, you need some realizations (implementations) of that interface.
A list of lists would essentially represent a tree structure, where each branch would constitute the same type as its parent, and its leaf nodes would represent values.
Stephane: Let me rephrase it: if x in list is not the thing that people complain not being a built-in function. They complain about the fact that there is not explicit way to find the first occurrence of something in a list that matches a certain condition. But as stated in my answer, next() can be (ab)used for that. Niklas B. Over a year ago
(List<Customer>)(Object)list; you must be sure that at runtime the list contains nothing but Customer objects. Critics say that such casting indicates something wrong with your code; you should be able to tweak your type declarations to avoid it. But Java generics is too complicated, and it is not perfect. Sometimes you just don't know if there is a pretty solution to satisfy the compiler ...