You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中HuggingFace为何使用**语法传递字典参数?

问题解答

关于Python对象传递与HuggingFace的实现逻辑

首先纠正一个常见误解:Python的对象传递是按共享对象传递(也常被称为按对象引用传递),并非严格意义上的“引用传递”(比如C++里的&引用)。HuggingFace框架里看似“类似指针”的操作,本质就是利用Python的这个特性——比如tokenizer输出的inputs字典中,存储的PyTorch张量(Tensor)本身就是引用类型,传递时不会复制底层的大块数据,只是传递指向数据内存的引用。

这么做核心是为了性能优化:NLP模型的输入张量通常体积很大,若每次传递都复制数据,会造成巨大的内存浪费和性能损耗。HuggingFace直接复用Python的对象传递机制,既符合Python语法习惯,又能高效处理大张量,完全没必要额外实现一套指针逻辑。

关于outputs = model(**batch)的含义

这行代码里的**是Python的字典解包运算符,作用是把字典中的键值对拆解成“关键字参数”的形式传递给函数。

举个例子:假设batch是tokenizer处理后得到的字典,结构大概是{'input_ids': tensor(...), 'attention_mask': tensor(...)},那么model(**batch)就等价于:

model(input_ids=batch['input_ids'], attention_mask=batch['attention_mask'])

这么写的好处是简洁性:HuggingFace模型的输入参数通常不止一两个(比如还有token_type_ids等),用字典解包可以避免手动写出所有参数,代码更简洁易维护。另外你提供的代码里可能存在笔误——前面定义的是inputs,后面用了batch,实际应该是model(**inputs)。

内容的提问来源于stack exchange,提问作者The Wanderer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 12:02:29