DEV Community

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

Posted on

Range in Python (4)

Buy Me a Coffee

*Memo:

A range can be read by slicing as shown below:

*Memo:

  • Slicing can be done with one or more [start:end:step] in the range [start, end):
    • start(Optional-Default:None-Type:int/NoneType):
      • It's a start index(inclusive).
      • If it's None, it's the 1st index.
      • Don't use start=.
    • end(Optional-Default:None-Type:int/NoneType):
      • It's an end index(exclusive).
      • If it's None, it's the range length.
      • Don't use end=.
    • step(Optional-Default:None-Type:int/NoneType):
      • It's the interval of indices.
      • If it's None, it's 1.
      • It cannot be zero.
      • Don't use end=.
    • The [] with at least one : is slicing.
    • start and end can be signed indices(zero and positive and negative indices).
    • Error doesn't occur even if [start, end) is out of the range [The 1st index, The range length).
v1 = range(8)

print(v1, *v1)
print(v1, *v1[:])
print(v1, *v1[::])
print(v1, *v1[None:None:None])
print(v1, *v1[0:8:1])
print(v1, *v1[-8:8:1])
print(v1, *v1[-100:100:1])
# range(0, 8) 0 1 2 3 4 5 6 7

v2 = v1[::2]

print(v2, *v2)
# range(0, 8, 2) 0 2 4 6

v2 = v1[::-2]

print(v2, *v2)
# range(7, -1, -2) 7 5 3 1

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

print(v2, *v2)
# range(2, 8) 2 3 4 5 6 7

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

print(v2, *v2)
# range(2, 8, 2) 2 4 6

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

print(v2, *v2)
# range(2, -1, -2) 2 0

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

print(v2, *v2)
# range(0, 6) 0 1 2 3 4 5

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

print(v2, *v2)
# range(0, 6, 2) 0 2 4

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

print(v2, *v2)
# range(7, 6, -2) 7

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

print(v2, *v2)
# range(2, 6) 2 3 4 5

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

print(v2, *v2)
# range(2, 6, 2) 2 4

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

print(v2, *v2)
# range(2, 6, -2) Nothing
Enter fullscreen mode Exit fullscreen mode

A range cannot be changed by indexing, slicing and a del statement as shown below:

*Memo:

  • A del statement cannot remove zero or more numbers from a range by indexing and slicing but can remove one or more variables themselves.
v = range(6)

print(*v)
# 0 1 2 3 4 5

v[1] = 10
v[-5] = 10
v[3:5] = [20, 30]
v[-3:-1] = [20, 30]
v[1], v[3:5] = 10, [20, 30]
v[-5], v[-3:-1] = 10, [20, 30]
# TypeError: 'range' object does not support item assignment
Enter fullscreen mode Exit fullscreen mode
v = range(6)

print(*v)
# 0 1 2 3 4 5

del v[1], v[3:5]
del v[-5], v[-2:5]
# TypeError: 'range' object does not support item deletion
Enter fullscreen mode Exit fullscreen mode
v = range(6)

del v

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

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

v1 = v2 = v3 = range(5)                # Equivalent
                                       # v1 = range(5)
print(v1, *v1) # range(0, 5) 0 1 2 3 4 # v2 = v1
print(v2, *v2) # range(0, 5) 0 1 2 3 4 # v3 = v2
print(v3, *v3) # range(0, 5) 0 1 2 3 4
Enter fullscreen mode Exit fullscreen mode

A range can be shallow-copied (only by slicing) but cannot deep-copied as shown below:

<Shallow copy>:

*Memo:

  • v1 and v2 refer to different ranges (only by slicing) and each same element.
  • is can check if v1 and v2 refer to the same range and each same element.
  • Slicing can shallow-copy the range.
  • copy.copy() cannot shallow-copy a range.
v1 = range(5)
v2 = v1[:]

print(v1, *v1) # range(0, 5) 0 1 2 3 4
print(v2, *v2) # range(0, 5) 0 1 2 3 4

print(v1 is v2, v1[2] is v2[2])
# False True
Enter fullscreen mode Exit fullscreen mode
import copy

v1 = range(5)
v2 = copy.copy(v1)

print(v1, *v1) # range(0, 5) 0 1 2 3 4
print(v2, *v2) # range(0, 5) 0 1 2 3 4

print(v1 is v2, v1[2] is v2[2])
# True True
Enter fullscreen mode Exit fullscreen mode

<Deep copy>:

*Memo:

  • v1 and v2 refer to the same range and each same element.
  • copy.deepcopy() cannot deep-copy and even shallow-copy a range.
import copy

v1 = range(5)
v2 = copy.deepcopy(v1)

print(v1, *v1) # range(0, 5) 0 1 2 3 4
print(v2, *v2) # range(0, 5) 0 1 2 3 4

print(v1 is v2, v1[2] is v2[2])
# True True
Enter fullscreen mode Exit fullscreen mode

Top comments (0)