Python函数中最大参数个数是多少?

众所周知,Python函数最多可以包含256个参数。我很好奇的是,此限制是否适用*args以及**kwargs何时按以下方式展开它们:

items = [1,2,3,4,5,6]

def do_something(*items):

pass

我问是因为,假设地,在某些情况下,大于256个项目的列表可能会以*args或的形式展开**kwargs

回答:

在Python

3.7和更高版本中,没有限制。这是在问题#27213和问题#12844中完成的工作的结果;#27213重新设计了CALL_FUNCTION*操作码系列,以提高性能和简化性(3.6的一部分),释放了操作码参数以仅对单个参数计数进行编码,并且#12844删除了编译时检查,该检查防止了带有更多参数的代码无法编译。

因此,从3.7开始,使用EXTENDED_ARG()opcode,现在可以使用显式参数传递多少个参数,保存多少可以装入堆栈(现在受内存 限制)就完全没有限制

>>> import sys

>>> sys.version_info

sys.version_info(major=3, minor=7, micro=0, releaselevel='alpha', serial=2)

>>> def f(*args, **kwargs): pass

...

>>> exec("f({})".format(', '.join(map(str, range(256)))))

>>> exec("f({})".format(', '.join(map(str, range(2 ** 16)))))

请注意,列表,元组和字典仅限于sys.maxsize元素,因此,如果被调用函数使用*args和/或包含**kwargs所有参数,则这些

元素将 受到限制。

对于*argsand**kwargs调用语法(扩展参数),除sys.maxintPython标准类型的大小限制相同外,没有其他限制。

Python 3.7之前的版本中,CPython在调用中限制为255个显式传递的参数:

>>> def f(*args, **kwargs): pass

...

>>> exec("f({})".format(', '.join(map(str, range(256)))))

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

File "<string>", line 1

SyntaxError: more than 255 arguments

之所以存在此限制,是因为直到Python

3.5,CALL_FUNCTION操作码都将操作码参数重载以对堆栈上的位置参数和关键字参数的数量进行编码,每个参数都编码为一个字节。

以上是 Python函数中最大参数个数是多少? 的全部内容, 来源链接: utcz.com/qa/412231.html

回到顶部