10.3. Unpack Assignment — Python
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:
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:
Unpacking assignment:
Chained assignment:
Chained unpacking assignment:
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