Python 函数中参数的最大数量是多少?

2024-03-14

众所周知,Python 函数最多可以有 256 个参数。我很想知道这个限制是否适用于*args and **kwargs当它们以下列方式展开时:

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

def do_something(*items):
    pass

我问这个问题是因为,假设,在某些情况下,超过 256 个项目的列表可能会展开为一组*args or **kwargs.


在 Python 3.7 及更高版本中,没有限制。这是完成工作的结果问题#27213 https://bugs.python.org/issue27213 and 问题#12844 https://bugs.python.org/issue12844; #27213 重做了CALL_FUNCTION*用于提高性能和简单性的操作码系列(3.6 的一部分),释放操作码参数以仅对单个参数计数进行编码,并且 #12844 删除了阻止编译具有更多参数的代码的编译时检查。

从 3.7 开始,EXTENDED_ARG() opcode https://docs.python.org/3/library/dis.html#opcode-EXTENDED_ARG,现在有完全没有限制关于使用显式参数可以传递多少个参数,保存可以将多少个参数放入堆栈(现在由您的记忆限制):

>>> 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 https://docs.python.org/3/library/sys.html#sys.maxsize元素,所以如果被调用的函数使用*args and/or **kwargs包罗万象的参数然后那些are有限的。

For the *args and **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 opcode https://docs.python.org/3.5/library/dis.html#opcode-CALL_FUNCTION重载操作码参数以对堆栈上的位置参数和关键字参数的数量进行编码,每个参数都以单个字节进行编码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 函数中参数的最大数量是多少? 的相关文章

随机推荐