To access a range of items in a list, you need to slice a list. One way to do this is to use the simple slicing operator `:`

With this operator you can specify where to start the slicing, where to end and specify the step.

## Slicing a List

If L is a list, the expression L [ start : stop : step ] returns the portion of the list from index start to index stop, at a step size step.

### Basic Example

Here is a basic example of list slicing.

``````L = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
print(L[2:7])
# Prints ['c', 'd', 'e', 'f', 'g']``````

Note that the item at index 7 `'h'` is not included.

## Slice with Negative Indices

You can also specify negative indices while slicing a list.

``````L = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
print(L[-7:-2])
# Prints ['c', 'd', 'e', 'f', 'g']``````

## Slice with Positive & Negative Indices

You can specify both positive and negative indices at the same time.

``````L = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
print(L[2:-5])
# Prints ['c', 'd']``````

## Specify Step of the Slicing

You can specify the step of the slicing using step parameter. The step parameter is optional and by default 1.

``````# Return every 2nd item between position 2 to 7
L = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
print(L[2:7:2])
# Prints ['c', 'e', 'g']``````

### Negative Step Size

You can even specify a negative step size.

``````# Return every 2nd item between position 6 to 1
L = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
print(L[6:1:-2])
# Prints ['g', 'e', 'c']``````

## Slice at Beginning & End

Omitting the start index starts the slice from the index 0. Meaning, `L[:stop]` is equivalent to `L[0:stop]`

``````# Slice the first three items from the list
L = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
print(L[:3])
# Prints ['a', 'b', 'c']``````

Whereas, omitting the stop index extends the slice to the end of the list. Meaning, `L[start:]` is equivalent to `L[start:len(L)]`

``````# Slice the last three items from the list
L = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
print(L[6:])
# Prints ['g', 'h', 'i']``````

## Reverse a List

You can reverse a list by omitting both start and stop indices and specifying a step as -1.

``````L = ['a', 'b', 'c', 'd', 'e']
print(L[::-1])
# Prints ['e', 'd', 'c', 'b', 'a']``````

## Modify Multiple List Values

You can modify multiple list items at once with slice assignment. This assignment replaces the specified slice of a list with the items of assigned iterable.

``````# Modify multiple list items
L = ['a', 'b', 'c', 'd', 'e']
L[1:4] = [1, 2, 3]
print(L)
# Prints ['a', 1, 2, 3, 'e']``````
``````# Replace multiple elements in place of a single element
L = ['a', 'b', 'c', 'd', 'e']
L[1:2] = [1, 2, 3]
print(L)
# Prints ['a', 1, 2, 3, 'c', 'd', 'e']``````

## Insert Multiple List Items

You can insert items into a list without replacing anything. Simply specify a zero-length slice.

``````# Insert at the start
L = ['a', 'b', 'c']
L[:0] = [1, 2, 3]
print(L)
# Prints [1, 2, 3, 'a', 'b', 'c']

# Insert at the end
L = ['a', 'b', 'c']
L[len(L):] = [1, 2, 3]
print(L)
# Prints ['a', 'b', 'c', 1, 2, 3]``````

You can insert items into the middle of list by keeping both the start and stop indices of the slice same.

``````# Insert in the middle
L = ['a', 'b', 'c']
L[1:1] = [1, 2, 3]
print(L)
# Prints ['a', 1, 2, 3, 'b', 'c']``````

## Delete Multiple List Items

You can delete multiple items out of the middle of a list by assigning the appropriate slice to an empty list.

``````L = ['a', 'b', 'c', 'd', 'e']
L[1:5] = []
print(L)
# Prints ['a']``````

You can also use the del statement with the same slice.

``````L = ['a', 'b', 'c', 'd', 'e']
del L[1:5]
print(L)
# Prints ['a']``````

## Clone or Copy a List

When you execute `new_List = old_List`, you don’t actually have two lists. The assignment just copies the reference to the list, not the actual list. So, both `new_List` and `old_List` refer to the same list after the assignment.

You can use slicing operator to actually copy the list (also known as a shallow copy).

``````L1 = ['a', 'b', 'c', 'd', 'e']
L2 = L1[:]
print(L2)
# Prints ['a', 'b', 'c', 'd', 'e']
print(L2 is L1)
# Prints False``````