Python 变量组包、解包及星号扩展机制详解

一、组包(Packing)

👉 把多个值"打包"成一个整体(通常是元组)

python 复制代码
a = 1, 2, 3
print(a)

输出:

复制代码
(1, 2, 3)

注意:

不是括号决定元组,而是逗号

python 复制代码
a = (1, 2, 3)   # 推荐写法

函数返回多个值(本质是组包)

python 复制代码
def func():
    return 1, 2

实际上等价于:

python 复制代码
return (1, 2)

二、解包(Unpacking)

👉 把一个整体拆成多个变量

python 复制代码
a, b = 1, 2

等价于:

python 复制代码
a, b = (1, 2)

解包列表

python 复制代码
nums = [10, 20]
x, y = nums

解包字符串

python 复制代码
a, b, c = "abc"

三、星号解包(重点)

这是进阶用法。

1️⃣ 收集剩余元素

python 复制代码
a, *b = [1, 2, 3, 4]

结果:

复制代码
a = 1
b = [2, 3, 4]

python 复制代码
a, *b, c = [1, 2, 3, 4, 5]
复制代码
a = 1
b = [2, 3, 4]
c = 5

2️⃣ 函数参数解包

python 复制代码
def add(a, b, c):
    print(a + b + c)

nums = [1, 2, 3]
add(*nums)

* 把列表拆开传入。


3️⃣ 字典解包

python 复制代码
def greet(name, age):
    print(name, age)

d = {"name": "Tom", "age": 18}
greet(**d)

** 解包字典。


四、可变参数(也是组包)

*args

python 复制代码
def func(*args):
    print(args)

调用:

python 复制代码
func(1, 2, 3)

输出:

复制代码
(1, 2, 3)

👉 本质:组包成元组


**kwargs

python 复制代码
def func(**kwargs):
    print(kwargs)

调用:

python 复制代码
func(name="Tom", age=18)

输出:

复制代码
{'name': 'Tom', 'age': 18}

👉 本质:组包成字典


五、扩展解包(Python 3.5+)

合并列表

python 复制代码
a = [1, 2]
b = [3, 4]

c = [*a, *b]

合并字典

python 复制代码
d1 = {"a": 1}
d2 = {"b": 2}

d = {**d1, **d2}

六、还有哪些相关概念?

1️⃣ 交换变量(本质是解包)

python 复制代码
a, b = b, a

2️⃣ 忽略变量

python 复制代码
a, _, c = (1, 2, 3)

3️⃣ enumerate 解包

python 复制代码
for i, value in enumerate([10, 20, 30]):
    print(i, value)

4️⃣ zip 解包

python 复制代码
names = ["a", "b"]
scores = [90, 80]

for name, score in zip(names, scores):
    print(name, score)

七、和 match(3.10+)的关系

在 Python 3.10 的 match 语句里,也支持结构解包:

python 复制代码
match (1, 2):
    case (a, b):
        print(a, b)

八、总结结构图

复制代码
组包
 ├─ 元组自动组包
 ├─ 函数 return
 ├─ *args
 └─ **kwargs

解包
 ├─ 变量赋值
 ├─ for 循环
 ├─ 函数调用 *
 ├─ 字典调用 **
 ├─ 星号收集 *
 └─ match 结构匹配
相关推荐
Jia ming1 小时前
编程思维VS法律思维:Python教学双轨制
python·教学
tod1132 小时前
Redis - 客户端基本介绍
开发语言·数据库·redis·缓存
赵谨言2 小时前
运用Python编程计算减压孔板孔口直径的研究
大数据·开发语言·经验分享·python
njsgcs2 小时前
用python打开exe 不闪退 0x01000000 # CREATE_BREAKAWAY_FROM_JOB
开发语言·python
橙露2 小时前
全栈开发入门:Python Flask+Vue3 搭建前后端分离的博客系统
开发语言·python·flask
黎雁·泠崖2 小时前
【魔法森林冒险】13/14 支线任务 & 计分系统:丰富性与结局
java·开发语言
夕除2 小时前
js-20
开发语言·javascript·windows
sheji34162 小时前
【开题答辩全过程】以 基于Java的甜品蛋糕网上商城的设计与实现为例,包含答辩的问题和答案
java·开发语言
智能零售小白白2 小时前
零售多门店库存调拨优化:需求预测与路径规划的技术实现
java·开发语言·零售