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 结构匹配
相关推荐
我不是疯子是傻子8 分钟前
Qt 实时曲线卡顿优化:从QPainter到OpenGL的3级加速实战
开发语言·qt
zlinear数据采集卡10 分钟前
D223 ADC数据处理流水线:从原始采样值到工程单位的完整转换链
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
nnerddboy1 小时前
Rust教程04:引用、借用与切片
开发语言·后端·rust
jerryinwuhan1 小时前
《Python数据预处理》第四章
开发语言·python
长江&后浪1 小时前
防火墙的描述
开发语言·网络·php
观无2 小时前
若依EasyExcel实现单元格合并
开发语言·前端·javascript
雨晨源码(同名B站)2 小时前
基于Python的网易云音乐评论数据情感化分析系统 音乐爬虫信息可视化 |SnowNLP评论情感分析
开发语言·hadoop·爬虫·python·信息可视化·毕业设计
阿童木写作2 小时前
跨境电商图片翻译工具推荐:跨马翻译批量处理视频字幕与抠图
python·音视频
我不是疯子是傻子2 小时前
串口通信数据帧粘包拆包再进化:基于 Qt 的滑动窗口与 CRC 校验实战
开发语言·qt
程序员老陆2 小时前
Qt中实现窗口真全屏(覆盖Windows任务栏)
开发语言·windows·qt