DEV Community

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

Posted on • Edited on

`*` iterable unpacking in Python variable assignment

Buy Me a Coffee

*Memos:

  • My post explains variable assignment.
  • My post explains iterable unpacking in variable assignment.
  • My post explains * for iterable unpacking in function.
  • My post explains ** for dictionary unpacking.
  • My post explains *args and **kwargs in function.

You can use * for iterable unpacking in a variable assignment as shown below:

*Memos:

  • A * is an iterable unpacking operator.
  • A *variable can store zero or more values as a list in a variable assignment.
  • Only one *variable can be used in each expression of the left side of a variable assignment.
  • Zero or more *iterables can be passed to a function with the zero or more values unpacked from zero or more iterables.
*v1, v2, v3 = [0, 1, 2, 3, 4] *v1, v2, v3 = (0, 1, 2, 3, 4) v1, v2, *v3 = [0, 1, 2, 3, 4] v1, *v2, v3 = [0, 1, 2, 3, 4] v1, *v2, v3 = [0, 1, 2, 3] v1, *v2, v3 = [0, 1, 2] v1, *v2, v3 = [0, 1] # No error  *v1, v2, *v3 = [0, 1, 2, 3, 4] # SyntaxError: multiple starred expressions in assignment  v1, *v2, v3 = [0] # ValueError: not enough values to unpack (expected at least 2, got 1) 
Enter fullscreen mode Exit fullscreen mode
*v1, = [] *v1, = 5, # Tuple *v1, = (5,) # No error  *v1, = [0, 1, 2] *v2 = *v1 # SyntaxError: can't use starred expression here *v1 = [] # SyntaxError: starred assignment target must be in a list or tuple *v1, = 5 # TypeError: cannot unpack non-iterable int object 
Enter fullscreen mode Exit fullscreen mode
*v1, v2, v3 = [0, 1, 2, 3, 4] *v1, v2, v3 = (0, 1, 2, 3, 4) print(v1, v2, v3) # [0, 1, 2] 3 4 print(*v1, v2, v3) # 0 1 2 3 4 
Enter fullscreen mode Exit fullscreen mode
v1, v2, *v3 = [0, 1, 2, 3, 4] print(v1, v2, v3) # 0 1 [2, 3, 4] print(v1, v2, *v3) # 0 1 2 3 4 
Enter fullscreen mode Exit fullscreen mode
v1, *v2, v3 = [0, 1, 2, 3, 4] print(v1, v2, v3) # 0 [1, 2, 3] 4 print(v1, *v2, v3) # 0 1 2 3 4 
Enter fullscreen mode Exit fullscreen mode
v1, *v2, v3 = [0, 1, 2, 3] print(v1, v2, v3) # 0 [1, 2] 3 print(v1, *v2, v3) # 0 1 2 3 
Enter fullscreen mode Exit fullscreen mode
v1, *v2, v3 = [0, 1, 2] print(v1, v2, v3) # 0 [1] 2 print(v1, *v2, v3) # 0 1 2 
Enter fullscreen mode Exit fullscreen mode
v1, *v2, v3 = [0, 1] print(v1, v2, v3) # 0 [] 1 print(v1, *v2, v3) # 0 1 
Enter fullscreen mode Exit fullscreen mode
*v1, = [0, 1, 2] print(v1) # [0, 1, 2] print(*v1) # 0 1 2 
Enter fullscreen mode Exit fullscreen mode
*v1, = [] print(v1) # [] print(*v1) # Nothing 
Enter fullscreen mode Exit fullscreen mode
*v1, = 5, # Tuple  print(v1) # [5] print(*v1) # 5 
Enter fullscreen mode Exit fullscreen mode

By default, one or more keys can be assigned to one or more variables from a dictrionary same as using keys() as shown below:

*v1, v2 = {'name":"John", "age":36, "gender":"Male"} *v1, v2 = {"name":"John", "age":36, "gender":"Male"}.keys() print(v1, v2) # ['name', 'age'] gender print(*v1, v2) # name age gender 
Enter fullscreen mode Exit fullscreen mode

One or more values can be assigned to one or more variables from a dictionary with values() as shown below:

*v1, v2 = {"name":"John", "age":36, "gender":"Male"}.values() print(v1, v2) # ['John', 36] Male print(*v1, v2) # John 36 Male 
Enter fullscreen mode Exit fullscreen mode

One or more keys and values can be assigned to one or more variables from a dictionary with items() as shown below:

*v1, v2 = {"name":"John", "age":36, "gender":"Male"}.items() print(v1, v2) # [('name', 'John'), ('age', 36)] ('gender', 'Male')  print(*v1, v2) # ('name', 'John') ('age', 36) ('gender', 'Male')  print(v1[0], v1[1], v2[0], v2[1]) # ('name', 'John') ('age', 36) gender Male  print(*v1[0], *v1[1], v2[0], v2[1]) # name John age 36 gender Male 
Enter fullscreen mode Exit fullscreen mode

One or more characters can be assigned to one or more variables from a string as shown below:

v1, v2, *v3 = "Hello" print(v1, v2, v3) # H e ['l', 'l', 'o'] print(v1, v2, *v3) # H e l l o 
Enter fullscreen mode Exit fullscreen mode

*Again, zero or more *iterables can be passed to a function with the zero or more values unpacked from zero or more iterables.

print(*[0, 1, 2]) print(*(0, 1, 2)) print(*range(3)) # 0 1 2  print(*'Hello') # H e l l o  print([[0, 1, 2], 'Hello']) # [[0, 1, 2], 'Hello'] print(*[[0, 1, 2], 'Hello']) # [0, 1, 2] Hello print([*[0, 1, 2], *'Hello']) # [0, 1, 2, 'H', 'e', 'l', 'l', 'o'] print(*[*[0, 1, 2], *'Hello']) # 0 1 2 H e l l o 
Enter fullscreen mode Exit fullscreen mode

Top comments (0)