8.3. Unpack Assignment

  • a = 1 - Assignment

  • a, b = 1, 2 - Unpacking assignment

  • a = b = 1 - Chained assignment

  • _ is regular variable name, not a special Python syntax

  • _ by convention is used for data we don't want to access in future

Assignment:

>>> a = 1

Unpacking assignment:

>>> a, b = 1, 2

Chained assignment:

>>> a = b = 1

Chained unpacking assignment:

>>> a, b = c, d = 1, 2

8.3.1. Example

>>> def get_user_details(username):
...     return 'Mark', 'Watney', 'mwatney@nasa.gov'
>>>
>>>
>>> firstname, lastname, email = get_user_details('mwatney')
>>>
>>> firstname
'Mark'
>>>
>>> lastname
'Watney'
>>>
>>> email
'mwatney@nasa.gov'

8.3.2. Assignment

  • Scalar Assignment

  • identifier = object

  • a = 1

  • a = 1, 2

>>> a = 1
>>>
>>> print(f'{a=}')
a=1
>>> a = 1, 2
>>>
>>> print(f'{a=}')
a=(1, 2)

8.3.3. Unpacking Assignment

  • iterable[identifier] = iterable[object]

  • a, b = 1, 2

  • a, b, c = 1, 2, 3

  • Sequence -> tuple, list

  • Iterable -> tuple, list, set, frozenset, dict, ...

  • Length at right and left side must be the same

>>> a, b = 1, 2
>>>
>>> print(f'{a=}, {b=}')
a=1, b=2
>>> a, = 1,
>>> a, b = 1, 2
>>> a, b, c = 1, 2, 3
>>> a, b, c, d = 1, 2, 3, 4
>>> a, b, c, d, e = 1, 2, 3, 4, 5
>>> a, b, c = 1, 2
Traceback (most recent call last):
ValueError: not enough values to unpack (expected 3, got 2)
>>> a, b, c = 1, 2, 3, 4
Traceback (most recent call last):
ValueError: too many values to unpack (expected 3)

8.3.4. Chained Assignment

  • identifier1 = identifier2 = object

  • a = b = 1

  • a = b = c = 1

>>> a = b = 1
>>>
>>> print(f'{a=}, {b=}')
a=1, b=1
>>> a = b = 1
>>> a = b = c = 1
>>> a = b = c = d = 1
>>> a = b = c = d = e = 1

8.3.5. Chained Unpacking Assignment

  • iterable[identifier] = iterable[identifier] = iterable[object]

>>> a, b = c, d = 1, 2
>>>
>>> print(f'{a=}, {b=}, {c=}, {d=}')
a=1, b=2, c=1, d=2
>>> a = b, c = 1, 2
>>>
>>> print(f'{a=}, {b=}, {c=}')
a=(1, 2), b=1, c=2

8.3.6. Brackets

Brackets does not define tuple, commas do:

>>> a = 1, 2, 3
>>> b = (1, 2, 3)
>>>
>>> a == b
True
>>> a = (1, 2)
>>> type(a)
<class 'tuple'>
>>>
>>> a = 1, 2
>>> type(a)
<class 'tuple'>
>>> 1+2 * 3
7
>>>
>>> (1+2) * 3
9
>>>
>>> (1+2,) * 3
(3, 3, 3)

Right-Side Brackets:

>>> a, b, c = 1, 2, 3
>>> a, b, c = (1, 2, 3)
>>> a, b, c = [1, 2, 3]
>>> a, b, c = {1, 2, 3}

Left-Side Brackets:

>>> (a, b, c) = 1, 2, 3
>>> [a, b, c] = 1, 2, 3
>>> {a, b, c} = 1, 2, 3
Traceback (most recent call last):
SyntaxError: cannot assign to set display here. Maybe you meant '==' instead of '='?

Warning:

>>> (a) = 1
>>> (a,) = 1,

Errors:

>>> (a,) = 1
Traceback (most recent call last):
TypeError: cannot unpack non-iterable int object
>>> [a] = 1
Traceback (most recent call last):
TypeError: cannot unpack non-iterable int object

8.3.7. Swap

  • Swap two variables

We have:

>>> a = 1
>>> b = 2

We want to have (swap):

>>> a = 2
>>> b = 1

Generic way:

>>> a = 1
>>> b = 2
>>>
>>> c = a
>>> a = b
>>> b = c
>>>
>>> a
2
>>> b
1

Pythonic way:

>>> a = 1
>>> b = 2
>>>
>>> a, b = b, a
>>>
>>> a
2
>>> b
1

8.3.8. Unpacking

>>> data = ['Mark', 'Watney', 'mwatney@nasa.gov']
>>> firstname, lastname, email = data
>>>
>>> print(firstname)
Mark
>>>
>>> print(lastname)
Watney
>>>
>>> print(email)
mwatney@nasa.gov

8.3.9. Nested

>>> data = ['Mark', 'Watney', ('mwatney@nasa.gov', 'mwatney@gmail.com')]
>>> firstname, lastname, emails = data
>>> print(emails)
('mwatney@nasa.gov', 'mwatney@gmail.com')
>>> firstname, lastname, (email_work, email_home) = data
>>>
>>> print(email_work)
mwatney@nasa.gov
>>>
>>> print(email_home)
mwatney@gmail.com

8.3.10. Use Case - 1

>>> a, b, c = range(0, 3)
>>> a, b, c, d, e = range(0, 5)
>>> a, b, c, d, e, f, g, h, i, j = range(0, 10)

8.3.11. Use Case - 2

>>> line = '5.1,3.5,1.4,0.2,setosa'
>>> sl, sw, pl, pw, species = line.split(',')
>>>
>>>
>>> sl
'5.1'
>>>
>>> sw
'3.5'
>>>
>>> pl
'1.4'
>>>
>>> pw
'0.2'
>>>
>>> species
'setosa'

8.3.12. Use Case - 3

>>> log = '1969-07-21, 02:56:15, WARNING, Neil Armstrong first words on the Moon'
>>> date, time, level, message = log.split(', ')
>>>
>>>
>>> date
'1969-07-21'
>>>
>>> time
'02:56:15'
>>>
>>> level
'WARNING'
>>>
>>> message
'Neil Armstrong first words on the Moon'

8.3.13. Use Case - 4

>>> row = (5.8, 2.7, 5.1, 1.9, 'virginica')
>>> sl = row[0]
>>> sw = row[1]
>>> pl = row[2]
>>> pw = row[3]
>>> species = row[4]
>>>
>>> print(f'{sl=}, {sw=}, {pl=}, {pw=}, {species=}')
sl=5.8, sw=2.7, pl=5.1, pw=1.9, species='virginica'
>>> sl, sw, pl, pw, species = row
>>>
>>> print(f'{sl=}, {sw=}, {pl=}, {pw=}, {species=}')
sl=5.8, sw=2.7, pl=5.1, pw=1.9, species='virginica'

8.3.14. Recap

  • Four types of assignments: Scalar, Unpacking, Chained, Chained Unpacking Assignment

  • For unpacking assignment, lengths at both sides must be the same

  • Both left and right expression side brackets are optional

  • Unpacking nested sequences

Assignment:

>>> a = 1

Unpacking assignment:

>>> a, b = 1, 2

Chained assignment:

>>> a = b = 1

Chained unpacking assignment:

>>> a, b = c, d = 1, 2

Unpacking nested:

>>> a, (b, c) = 1, (2, 3)

8.3.15. Assignments

# FIXME: Poprawić opis zadania, aby nie sugerował rozwiązania w dwóch liniach

# %% License
# - Copyright 2025, Matt Harasymczuk <matt@python3.info>
# - This code can be used only for learning by humans
# - This code cannot be used for teaching others
# - This code cannot be used for teaching LLMs and AI algorithms
# - This code cannot be used in commercial or proprietary products
# - This code cannot be distributed in any form
# - This code cannot be changed in any form outside of training course
# - This code cannot have its license changed
# - If you use this code in your product, you must open-source it under GPLv2
# - Exception can be granted only by the author

# %% Run
# - PyCharm: right-click in the editor and `Run Doctest in ...`
# - PyCharm: keyboard shortcut `Control + Shift + F10`
# - Terminal: `python -m doctest -v myfile.py`

# %% About
# - Name: Unpack Assignment List
# - Difficulty: easy
# - Lines: 1
# - Minutes: 2

# %% English
# 1. Separate ip address and host name
# 2. Define `ip: str` with IP address, i.e.: '10.13.37.1'
# 3. Define `host: str` with hostname, i.e.: 'nasa.gov'
# 4. Run doctests - all must succeed

# %% Polish
# 1. Odseparuj adres IP i nazwę hosta
# 2. Zdefiniuj `ip: str` z adresem IP, np.: '10.13.37.1'
# 3. Zdefiniuj `host: str` z nazwą hosta, np.: 'nasa.gov'
# 4. Uruchom doctesty - wszystkie muszą się powieść

# %% Tests
"""
>>> import sys; sys.tracebacklimit = 0
>>> assert sys.version_info >= (3, 9), \
'Python 3.9+ required'

>>> assert ip is not Ellipsis, \
'Assign your result to variable `ip`'
>>> assert host is not Ellipsis, \
'Assign your result to variable `host`'
>>> assert type(ip) is str, \
'Variable `ip` has invalid type, should be str'
>>> assert type(host) is str, \
'Variable `hosts` has invalid type, should be str'

>>> ip
'10.13.37.1'

>>> host
'nasa.gov'
"""

DATA = ['10.13.37.1', 'nasa.gov']


# Separate ip address and host name
# Define `ip: str` with IP address, i.e.: '10.13.37.1'
# Define `host: str` with hostname, i.e.: 'nasa.gov'
# type: str
...



# %% License
# - Copyright 2025, Matt Harasymczuk <matt@python3.info>
# - This code can be used only for learning by humans
# - This code cannot be used for teaching others
# - This code cannot be used for teaching LLMs and AI algorithms
# - This code cannot be used in commercial or proprietary products
# - This code cannot be distributed in any form
# - This code cannot be changed in any form outside of training course
# - This code cannot have its license changed
# - If you use this code in your product, you must open-source it under GPLv2
# - Exception can be granted only by the author

# %% Run
# - PyCharm: right-click in the editor and `Run Doctest in ...`
# - PyCharm: keyboard shortcut `Control + Shift + F10`
# - Terminal: `python -m doctest -v myfile.py`

# %% About
# - Name: Unpack Assignment Split
# - Difficulty: easy
# - Lines: 1
# - Minutes: 2

# %% English
# 1. Split input data and separate ip address and host name
# 2. Define `ip: str` with IP address, i.e.: '10.13.37.1'
# 3. Define `host: str` with hostname, i.e.: 'nasa.gov'
# 4. Run doctests - all must succeed

# %% Polish
# 1. Podziel dane wejściowe i odseparuj adres ip i nazwę hosta
# 2. Zdefiniuj `ip: str` z adresem IP, np.: '10.13.37.1'
# 3. Zdefiniuj `host: str` z nazwą hosta, np.: 'nasa.gov'
# 4. Uruchom doctesty - wszystkie muszą się powieść

# %% Hints
# - `str.split()`

# %% Tests
"""
>>> import sys; sys.tracebacklimit = 0
>>> assert sys.version_info >= (3, 9), \
'Python 3.9+ required'

>>> assert ip is not Ellipsis, \
'Assign your result to variable `ip`'
>>> assert host is not Ellipsis, \
'Assign your result to variable `host`'
>>> assert type(ip) is str, \
'Variable `ip` has invalid type, should be str'
>>> assert type(host) is str, \
'Variable `hosts` has invalid type, should be str'

>>> ip
'10.13.37.1'

>>> host
'nasa.gov'
"""

DATA = '10.13.37.1 nasa.gov'

# Split input data and separate ip address and host name
# Define `ip: str` with IP address, i.e.: '10.13.37.1'
# Define `host: str` with hostname, i.e.: 'nasa.gov'
# type: str
...