10.3. Unpack Assignment
a = 1- Assignmenta, b = 1, 2- Unpacking assignmenta = 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:
>>> name = 'Alice'
Unpacking assignment:
>>> firstname, lastname = 'Alice', 'Apricot'
Chained assignment:
>>> name1 = name2 = 'Alice'
Chained unpacking assignment:
>>> firstname1, lastname1 = firstname2, lastname2 = 'Alice', 'Apricot'
10.3.1. Case Study
SetUp:
>>> def get_user():
... return 'Alice', 'Apricot'
You can use getitem to extract values:
>>> user = get_user()
>>>
>>> firstname = user[0]
>>> lastname = user[1]
Or you can use unpack assignment
>>> firstname, lastname = get_user()
In both cases result is the same:
>>> firstname
'Alice'
>>>
>>> lastname
'Apricot'
10.3.2. Assignment
Scalar Assignment
identifier = objectname = 'Alice'name = 'Alice', 'Apricot'
>>> name = 'Alice'
>>>
>>> name
'Alice'
>>> name = 'Alice', 'Apricot'
>>>
>>> name
('Alice', 'Apricot')
10.3.3. Unpacking Assignment
iterable[identifier] = iterable[object]firstname, lastname = 'Alice', 'Apricot'a, b, c = 1, 2, 3Sequence -> tuple, list
Iterable -> tuple, list, set, frozenset, dict, ...
Length at right and left side must be the same
>>> firstname, lastname = 'Alice', 'Apricot'
>>>
>>>
>>> firstname
'Alice'
>>>
>>> lastname
'Apricot'
This also work if there are more identifiers and values:
>>> firstname, lastname, age, email = 'Alice', 'Apricot', 30, 'alice@example.com'
>>>
>>>
>>> firstname
'Alice'
>>>
>>> lastname
'Apricot'
>>>
>>> age
30
>>>
>>> email
'alice@example.com'
But, the number of both identifiers and values must be equal.
You will get an error if there is more identifiers than values:
>>> firstname, lastname, age = 'Alice', 'Apricot'
Traceback (most recent call last):
ValueError: not enough values to unpack (expected 3, got 2)
Also, you will get an error if you get more values than identifiers:
>>> firstname, lastname = 'Alice', 'Apricot', 30
Traceback (most recent call last):
ValueError: too many values to unpack (expected 2, got 3)
10.3.4. Chained Assignment
identifier1 = identifier2 = objectname1 = name2 = 'Alice'name1 = name2 = name3 = name4 = 'Alice'
>>> name1 = name2 = 'Alice'
>>>
>>>
>>> name1
'Alice'
>>>
>>> name2
'Alice'
>>> name1 = name2 = name3 = name4 = 'Alice'
>>>
>>>
>>> name1
'Alice'
>>>
>>> name2
'Alice'
>>>
>>> name3
'Alice'
>>>
>>> name4
'Alice'
10.3.5. Chained Unpacking Assignment
iterable[identifier] = iterable[identifier] = iterable[object]firstname1, lastname1 = firstname2, lastname2 = 'Alice', 'Apricot'
>>> firstname1, lastname1 = firstname2, lastname2 = 'Alice', 'Apricot'
>>>
>>>
>>> firstname1
'Alice'
>>>
>>> lastname1
'Apricot'
>>>
>>> firstname2
'Alice'
>>>
>>> lastname2
'Apricot'
10.3.6. Brackets
firstname, lastname = 'Alice', 'Apricot'firstname, lastname = ('Alice', 'Apricot')firstname, lastname = ['Alice', 'Apricot'](firstname, lastname) = 'Alice', 'Apricot'(firstname, lastname) = ('Alice', 'Apricot')(firstname, lastname) = ['Alice', 'Apricot'][firstname, lastname] = 'Alice', 'Apricot'[firstname, lastname] = ('Alice', 'Apricot')[firstname, lastname] = ['Alice', 'Apricot']
Brackets does not define tuple, commas do:
>>> firstname, lastname = 'Alice', 'Apricot'
Identifier brackets are optional:
>>> firstname, lastname = 'Alice', 'Apricot'
>>> firstname, lastname = ('Alice', 'Apricot')
>>> firstname, lastname = ['Alice', 'Apricot']
But they can be tuples:
>>> (firstname, lastname) = 'Alice', 'Apricot'
>>> (firstname, lastname) = ('Alice', 'Apricot')
>>> (firstname, lastname) = ['Alice', 'Apricot']
Or lists:
>>> [firstname, lastname] = 'Alice', 'Apricot'
>>> [firstname, lastname] = ('Alice', 'Apricot')
>>> [firstname, lastname] = ['Alice', 'Apricot']
10.3.7. Nested
firstname, lastname, (email_work, email_school) = 'Alice', 'Apricot', ('alice@example.com', 'alice@example.edu')
>>> firstname, lastname, (email_work, email_school) = 'Alice', 'Apricot', ('alice@example.com', 'alice@example.edu')
>>>
>>>
>>> firstname
'Alice'
>>>
>>> lastname
'Apricot'
>>>
>>> email_work
'alice@example.com'
>>>
>>> email_school
'alice@example.edu'
10.3.8. Swap
Swap two variables
a = 'Alice'b = 'Bob'a, b = b, a
Generic way:
>>> a = 'Alice'
>>> b = 'Bob'
>>>
>>> c = a
>>> a = b
>>> b = c
>>>
>>>
>>> a
'Bob'
>>>
>>> b
'Alice'
Pythonic way:
>>> a = 'Alice'
>>> b = 'Bob'
>>>
>>> a, b = b, a
>>>
>>>
>>> a
'Bob'
>>>
>>> b
'Alice'
10.3.9. Use Case - 1
Imagine, that we have a Dragon with 100 gold and a Hero with 50 gold
Hero kills Dragon and takes all Dragon's gold
At the end, Hero has all gold (150) and Dragon has 0
>>> dragon_gold = 100
>>> hero_gold = 0
>>>
>>> hero_gold, dragon_gold = dragon_gold, 0
>>>
>>> hero_gold
100
>>>
>>> dragon_gold
0
10.3.10. Use Case - 2
Imagine, that we have a Dragon with 100 gold and a Hero with 50 gold
Hero kills Dragon and takes all Dragon's gold
At the end, Hero has all gold (150) and Dragon has 0
>>> dragon_gold = 100
>>> hero_gold = 10
>>>
>>> hero_gold, dragon_gold = hero_gold+dragon_gold, 0
>>>
>>> hero_gold
110
>>> dragon_gold
0
10.3.11. Use Case - 3
>>> 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'
10.3.12. Use Case - 4
>>> 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'
10.3.13. Use Case - 5
>>> 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'
10.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)
10.3.15. Assignments
# %% About
# - Name: Unpack Assignment List
# - Difficulty: easy
# - Lines: 1
# - Minutes: 1
# %% 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
# %% English
# 1. Separate firstname, lastname and age from variable `DATA`
# 2. Define variable `firstname` with firstname
# 3. Define variable `lastname` with lastname
# 4. Define variable `age` with age
# 5. Use unpack assignment
# 6. Run doctests - all must succeed
# %% Polish
# 1. Odseparuj imię, nazwisko i wiek ze zmiennej `DATA`
# 2. Zdefiniuj zmienną `firstname` z imieniem
# 3. Zdefiniuj zmienną `lastname` z nazwiskiem
# 4. Zdefiniuj zmienną `age` z wiekiem
# 5. Użyj przypisania z rozpakowaniem (unpack assignment)
# 6. Uruchom doctesty - wszystkie muszą się powieść
# %% Expected
# >>> firstname
# 'Alice'
#
# >>> lastname
# 'Apricot'
#
# >>> age
# 30
# %% Doctests
"""
>>> import sys; sys.tracebacklimit = 0
>>> assert sys.version_info >= (3, 9), \
'Python has an is invalid version; expected: `3.9` or newer.'
>>> assert firstname is not Ellipsis, \
'Variable `firstname` has an invalid value; assign result of your program to it.'
>>> assert lastname is not Ellipsis, \
'Variable `lastname` has an invalid value; assign result of your program to it.'
>>> assert age is not Ellipsis, \
'Variable `age` has an invalid value; assign result of your program to it.'
>>> assert type(firstname) is str, \
'Variable `firstname` has an invalid type; expected: `str`.'
>>> assert type(lastname) is str, \
'Variable `lastname` has an invalid type; expected: `str`.'
>>> assert type(age) is int, \
'Variable `age` has an invalid type; expected: `int`.'
>>> result = open(__file__).read()
>>> assert 'firstname, lastname, age' + ' = ' + 'DATA' in result, \
'Use unpack assignment'
>>> firstname
'Alice'
>>> lastname
'Apricot'
>>> age
30
"""
# %% Run
# - PyCharm: right-click in the editor and `Run Doctest in ...`
# - PyCharm: keyboard shortcut `Control + Shift + F10`
# - Terminal: `python -m doctest -f -v myfile.py`
# %% Imports
# %% Types
firstname: str
lastname: str
age: int
# %% Data
DATA = ['Alice', 'Apricot', 30]
# %% Result
# %% About
# - Name: Unpack Assignment List
# - Difficulty: easy
# - Lines: 1
# - Minutes: 1
# %% 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
# %% English
# 1. Separate firstname, lastname and age from variable `DATA`
# 2. Define variable `firstname` with firstname
# 3. Define variable `lastname` with lastname
# 4. Define variable `age` with age
# 5. Use unpack assignment
# 6. Run doctests - all must succeed
# %% Polish
# 1. Odseparuj imię, nazwisko i wiek ze zmiennej `DATA`
# 2. Zdefiniuj zmienną `firstname` z imieniem
# 3. Zdefiniuj zmienną `lastname` z nazwiskiem
# 4. Zdefiniuj zmienną `age` z wiekiem
# 5. Użyj przypisania z rozpakowaniem (unpack assignment)
# 6. Uruchom doctesty - wszystkie muszą się powieść
# %% Expected
# >>> firstname
# 'Alice'
#
# >>> lastname
# 'Apricot'
#
# >>> age
# '30'
# %% Doctests
"""
>>> import sys; sys.tracebacklimit = 0
>>> assert sys.version_info >= (3, 9), \
'Python has an is invalid version; expected: `3.9` or newer.'
>>> assert firstname is not Ellipsis, \
'Variable `firstname` has an invalid value; assign result of your program to it.'
>>> assert lastname is not Ellipsis, \
'Variable `lastname` has an invalid value; assign result of your program to it.'
>>> assert age is not Ellipsis, \
'Variable `age` has an invalid value; assign result of your program to it.'
>>> assert type(firstname) is str, \
'Variable `firstname` has an invalid type; expected: `str`.'
>>> assert type(lastname) is str, \
'Variable `lastname` has an invalid type; expected: `str`.'
>>> assert type(age) is str, \
'Variable `age` has an invalid type; expected: `str`.'
>>> result = open(__file__).read()
>>> assert 'firstname, lastname, age' + ' = ' + 'DATA' in result, \
'Use unpack assignment'
>>> firstname
'Alice'
>>> lastname
'Apricot'
>>> age
'30'
"""
# %% Run
# - PyCharm: right-click in the editor and `Run Doctest in ...`
# - PyCharm: keyboard shortcut `Control + Shift + F10`
# - Terminal: `python -m doctest -f -v myfile.py`
# %% Imports
# %% Types
firstname: str
lastname: str
age: str
# %% Data
DATA = 'Alice,Apricot,30'
# %% Result