DEV Community

Super Kai (Kazuya Ito)
Super Kai (Kazuya Ito)

Posted on • Edited on

List in Python (6)

Buy Me a Coffee

*Memo:

A list can be changed by slicing and a del statement as shown below:

*Memo:

  • Slicing can shallow-copy a list.
  • An iterable must be assigned to a sliced variable.
  • A del statement can remove zero or more elements from a list by slicing and can remove one or more variables themselves.

<1D list>:

v1 = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']

v2 = v1[:]
v2 = v1[-100:100]
v2[-100:100] = v1[:]

v2[2:6] = [0, 1, 2, 3, 4, 5]
# v2[-6:-2] = [0, 1, 2, 3, 4, 5]

print(v2)
# ['A', 'B', 0, 1, 2, 3, 4, 5, 'G', 'H']

v2 = v1[:]

v2[2:6] = [[0, 1, 2, 3, 4, 5]]
# v2[-6:-2] = [[0, 1, 2, 3, 4, 5]]

print(v2)
# ['A', 'B', [0, 1, 2, 3, 4, 5], 'G', 'H']

v2 = v1[:]

v2[2:6:2] = [0, 1]
# v2[-6:-2:2] = [0, 1]

print(v2)
# ['A', 'B', 0, 'D', 1, 'F', 'G', 'H']

v2 = v1[:]

v2[2:6:2] = [[0, 1, 2], [3, 4, 5]]
# v2[-6:-2:2] = [[0, 1, 2], [3, 4, 5]]

print(v2)
# ['A', 'B', [0, 1, 2], 'D', [3, 4, 5], 'F', 'G', 'H']

v2 = v1[:]

v2[2:2] = []
# v2[-6:-6] = []

print(v2)
# ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']

v2 = v1[:]

v2[2:6] = 0
v2[-6:-2] = 0
# TypeError: must assign iterable to extended slice
Enter fullscreen mode Exit fullscreen mode
v1 = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']

v2 = v1[:]

del v2[:], v2[-100:100]

print(v2)
# []

v2 = v1[:]

del v2[2:6]
# del v2[-6:-2]

print(v2)
# ['A', 'B', 'G', 'H']

v2 = v1[:]

del v2[2:6:2]
# del v2[-6:-2:2]

print(v2)
# ['A', 'B', 'D', 'F', 'G', 'H']

v2 = v1[:]

del v2[2:2]
# del v2[-6:-6]

print(v1)
# ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']

del v1, v2

print(v1)
# NameError: name 'v1' is not defined

print(v2)
# NameError: name 'v2' is not defined
Enter fullscreen mode Exit fullscreen mode

<2D list>:

v = [['A', 'B', 'C', 'D'], ['E', 'F', 'G', 'H']]

v[0][1:3] = [0, 1, 2, 3]
# v[-2][-3:-1] = [0, 1, 2, 3]

print(v)
# [['A', 0, 1, 2, 3, 'D'], ['E', 'F', 'G', 'H']]

v[1][::2] = [0, 1]
# v[-1][::2] = [0, 1]

print(v)
# [['A', 0, 1, 2, 3, 'D'], [0, 'F', 1, 'H']]

v[0][1::3] = [[0, 1, 2, 3], [0, 1, 2, 3]]
# v[-2][-5::3] = [[0, 1, 2, 3], [0, 1, 2, 3]]

print(v)
# [['A', [0, 1, 2, 3], 1, 2, [0, 1, 2, 3], 'D'], [0, 'F', 1, 'H']]

v[1][1:3] = [[0, 1, 2, 3]]
# v[-1][-3:-1] = [[0, 1, 2, 3]]

# v[0][1:3], v[1][::2], v[0][1::3], v[1][1:3] = \
#     [0, 1, 2, 3], [0, 1], [[0, 1, 2, 3], [0, 1, 2, 3]], [[0, 1, 2, 3]]
# v[-2][-3:-1], v[-1][::2], v[-2][-5::3], v[-1][-3:-1] = \
#     [0, 1, 2, 3], [0, 1], [[0, 1, 2, 3], [0, 1, 2, 3]], [[0, 1, 2, 3]]

print(v)
# [['A', [0, 1, 2, 3], 1, 2, [0, 1, 2, 3], 'D'], [0, [0, 1, 2, 3], 'H']]

del v[0][:3], v[1][::2]
# del v[-2][:-3], v[-1][::2]

print(v)
# [[2, [0, 1, 2, 3], 'D'], [[0, 1, 2, 3]]]
Enter fullscreen mode Exit fullscreen mode

<3D list>:

v = [[['A', 'B'], ['C', 'D']], [['E', 'F'], ['G', 'H']]]

v[0][1:] = [0, 1, 2, 3]
# v[-2][-1:] = [0, 1, 2, 3]

print(v)
# [[['A', 'B'], 0, 1, 2, 3], [['E', 'F'], ['G', 'H']]]

v[1][0][0:] = [0, 1, 2, 3]
# v[-1][-2][-2:] = [0, 1, 2, 3]

print(v)
# [[['A', 'B'], 0, 1, 2, 3], [[0, 1, 2, 3], ['G', 'H']]]

v[1][1][::2] = [[0, 1, 2, 3]]
# v[-1][-1][::2] = [[0, 1, 2, 3]]

# v[0][1:], v[1][0][0:], v[1][1][::2] = \
#     [0, 1, 2, 3], [0, 1, 2, 3], [[0, 1, 2, 3]]
# v[-2][-1:], v[-1][-2][-2:], v[-1][-1][::2] = \
#     [0, 1, 2, 3], [0, 1, 2, 3], [[0, 1, 2, 3]]

print(v)
# [[['A', 'B'], 0, 1, 2, 3], [[0, 1, 2, 3], [[0, 1, 2, 3], 'H']]]

del v[0][1:], v[1][0][0:], v[1][1][::2]
# del v[-2][-4:], v[-1][-2][-4:], v[-1][-1][::2]

print(v)
# [[['A', 'B']], [[], ['H']]]
Enter fullscreen mode Exit fullscreen mode

A list can be continuously used through multiple variables as shown below:

v1 = v2 = v3 = ['a', 'b', 'c', 'd', 'e'] # Equivalent
                                         # v1 = ['a', 'b', 'c', 'd', 'e']
v1[0] = 'X'                              # v2 = v1
v2[3:5] = ['Y', 'Z']                     # v3 = v2
del v3[1:3]

print(v1) # ['X', 'Y', 'Z']
print(v2) # ['X', 'Y', 'Z']
print(v3) # ['X', 'Y', 'Z']
Enter fullscreen mode Exit fullscreen mode

A list can be shallow-copied and deep-copied as shown below:

<Shallow copy>:

*Memo:

  • v1 and v2 refer to different outer lists and the same inner list.
  • is keyword can check if v1 and v2 refer to the same outer and inner list.
  • list.copy(), copy.copy(), list() and slicing can shallow-copy a list:
    • list.copy() has no arguments.
import copy

v1 = ['a', 'b', ['c', 'd']]
v2 = v1.copy()
v2 = copy.copy(v1)
v2 = list(v1)
v2 = v1[:]

print(v1) # ['a', 'b', ['c', 'd']]
print(v2) # ['a', 'b', ['c', 'd']]

print(v1 is v2, v1[2] is v2[2])
# False True

v2[1] = 'X'
v2[2][0] = 'Y'
          #       ↓↓↓   ↓↓↓
print(v1) # ['a', 'b', ['Y', 'd']]
print(v2) # ['a', 'X', ['Y', 'd']]
          #       ↑↑↑   ↑↑↑
Enter fullscreen mode Exit fullscreen mode

<Deep copy>:

*Memo:

  • v1 and v2 refer to different outer and inner lists.
  • copy.deepcopy() deep-copies a list.
  • copy.deepcopy() should be used because it's safe, deeply copying a list while list.copy(), copy.copy(), list() and slicing aren't safe, shallowly copying a list.
import copy 

v1 = ['a', 'b', ['c', 'd']]
v2 = copy.deepcopy(v1)

print(v1) # ['a', 'b', ['c', 'd']]
print(v2) # ['a', 'b', ['c', 'd']]

print(v1 is v2, v1[2] is v2[2])
# False False

v2[1] = 'X'
v2[2][0] = 'Y'
          #       ↓↓↓   ↓↓↓
print(v1) # ['a', 'b', ['c', 'd']]
print(v2) # ['a', 'X', ['Y', 'd']]
          #       ↑↑↑   ↑↑↑
Enter fullscreen mode Exit fullscreen mode

Top comments (0)