Home > Backend Development > Python Tutorial > How to Understand Complex Unpacking Expressions in Python?

How to Understand Complex Unpacking Expressions in Python?

Patricia Arquette
Release: 2024-12-05 15:11:11
Original
485 people have browsed it

How to Understand Complex Unpacking Expressions in Python?

Understanding complex unpacking expressions

Consider the following expression:

a, b = 1, 2                          # 简单序列赋值
a, b = ['green', 'blue']             # 列表赋值
a, b = 'XY'                          # 字符串赋值
a, b = range(1,5,2)                  # 任何可迭代对象都可以

                                     # 嵌套序列赋值

(a,b), c = "XY", "Z"                 # a = 'X', b = 'Y', c = 'Z' 

(a,b), c = "XYZ"                     # 错误 -- 太多值需要拆包
(a,b), c = "XY"                      # 错误 -- 需要拆包的数值太少

(a,b), c, = [1,2],'this'             # a = '1', b = '2', c = 'this'
(a,b), (c,) = [1,2],'this'           # 错误 -- 太多值需要拆包


                                     # 扩展序列拆包

a, *b = 1,2,3,4,5                    # a = 1, b = [2,3,4,5]
*a, b = 1,2,3,4,5                    # a = [1,2,3,4], b = 5
a, *b, c = 1,2,3,4,5                 # a = 1, b = [2,3,4], c = 5

a, *b = 'X'                          # a = 'X', b = []
*a, b = 'X'                          # a = [], b = 'X'
a, *b, c = "XY"                      # a = 'X', b = [], c = 'Y'
a, *b, c = "X...Y"                   # a = 'X', b = ['.','.','.'], c = 'Y'

a, b, *c = 1,2,3                     # a = 1, b = 2, c = [3]
a, b, c, *d = 1,2,3                  # a = 1, b = 2, c = 3, d = []

a, *b, c, *d = 1,2,3,4,5             # 错误 -- 赋值中出现了两个星号表达式

(a,b), c = [1,2],'this'              # a = '1', b = '2', c = 'this'
(a,b), *c = [1,2],'this'             # a = '1', b = '2', c = ['this']

(a,b), c, *d = [1,2],'this'          # a = '1', b = '2', c = 'this', d = []
(a,b), *c, d = [1,2],'this'          # a = '1', b = '2', c = [], d = 'this'

(a,b), (c, *d) = [1,2],'this'        # a = '1', b = '2', c = 't', d = ['h', 'i', 's']

*a = 1                               # 错误 -- 目标必须在一个列表或元组中
*a = (1,2)                           # 错误 -- 目标必须在一个列表或元组中
*a, = (1,2)                          # a = [1,2]
*a, = 1                              # 错误 -- 'int' 对象不可迭代
*a, = [1]                            # a = [1]
*a = [1]                             # 错误 -- 目标必须在一个列表或元组中
*a, = (1,)                           # a = [1]
*a, = (1)                            # 错误 -- 'int' 对象不可迭代

*a, b = [1]                          # a = [], b = 1
*a, b = (1,)                         # a = [], b = 1

(a,b),c = 1,2,3                      # 错误 -- 太多值需要拆包
(a,b), *c = 1,2,3                    # 错误 - 'int' 对象不可迭代
(a,b), *c = 'XY', 2, 3               # a = 'X', b = 'Y', c = [2,3]


                                     # 扩展序列拆包 -- 嵌套

(a,b),c = 1,2,3                      # 错误 -- 太多值需要拆包
*(a,b), c = 1,2,3                    # a = 1, b = 2, c = 3

*(a,b) = 1,2                         # 错误 -- 目标必须在一个列表或元组中
*(a,b), = 1,2                        # a = 1, b = 2

*(a,b) = 'XY'                        # 错误 -- 目标必须在一个列表或元组中
*(a,b), = 'XY'                       # a = 'X', b = 'Y'

*(a, b) = 'this'                     # 错误 -- 目标必须在一个列表或元组中
*(a, b), = 'this'                    # 错误 -- 拆包的值太多了
*(a, *b), = 'this'                   # a = 't', b = ['h', 'i', 's']

*(a, *b), c = 'this'                 # a = 't', b = ['h', 'i'], c = 's'

*(a,*b), = 1,2,3,3,4,5,6,7           # a = 1, b = [2, 3, 3, 4, 5, 6, 7]

*(a,*b), *c = 1,2,3,3,4,5,6,7        # 错误 -- 赋值中出现了两个星号表达式
*(a,*b), (*c,) = 1,2,3,3,4,5,6,7     # 错误 -- 'int' 对象不可迭代
*(a,*b), c = 1,2,3,3,4,5,6,7         # a = 1, b = [2, 3, 3, 4, 5, 6], c = 7
*(a,*b), (*c,) = 1,2,3,4,5,'XY'      # a = 1, b = [2, 3, 4, 5], c = ['X', 'Y']

*(a,*b), c, d = 1,2,3,3,4,5,6,7      # a = 1, b = [2, 3, 3, 4, 5], c = 6, d = 7
*(a,*b), (c, d) = 1,2,3,3,4,5,6,7    # 错误 -- 'int' 对象不可迭代
*(a,*b), (*c, d) = 1,2,3,3,4,5,6,7   # 错误 -- 'int' 对象不可迭代
*(a,*b), *(c, d) = 1,2,3,3,4,5,6,7   # 错误 -- 赋值中出现了两个星号表达式


*(a,b), c = 'XY', 3                  # 错误 -- 需要拆包的数值太少
*(*a,b), c = 'XY', 3                 # a = [], b = 'XY', c = 3
(a,b), c = 'XY', 3                   # a = 'X', b = 'Y', c = 3

*(a,b), c = 'XY', 3, 4               # a = 'XY', b = 3, c = 4
*(*a,b), c = 'XY', 3, 4              # a = ['XY'], b = 3, c = 4
(a,b), c = 'XY', 3, 4                # 错误 -- 拆包的值太多了
Copy after login

Manually derive the results of these expressions

Generalizing them is not difficult once you have a few basic rules. I'll do my best to explain with some examples. Since you mentioned "manually" evaluating these expressions, I would suggest some simple replacement rules. Basically, you'll find it easier to understand expressions where all iterables are formatted the same way.

For unpacking purposes only, the following substitutions are valid in rvalues ​​(i.e. iterable objects):

'XY' -> ('X', 'Y')
['X', 'Y'] -> ('X', 'Y')
Copy after login

If you find a value is not unpacked, then you need to undo the substitution. (See below for further explanation.)

Also, when you see a "bare" comma, imagine there is a tuple at the top. Do this on the left and right sides (i.e. iterable and right iterable):

'X', 'Y' -> ('X', 'Y')
a, b -> (a, b)
Copy after login

The above is the detailed content of How to Understand Complex Unpacking Expressions in Python?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template