众所周知,Python 函数最多可以有 256 个参数。我很想知道的是,当 *args
和 **kwargs
按以下方式展开时,此限制是否适用:
items = [1,2,3,4,5,6]
def do_something(*items):
pass
我之所以问是因为,假设在某些情况下,超过 256 个项目的列表会被展开为一组 *args
或 **kwargs
。
最佳答案
在 Python 3.7 及更高版本中,没有限制。这是 issue #27213 中所做工作的结果和 issue #12844 ; #27213 重新设计了 CALL_FUNCTION*
系列操作码以提高性能和简单性(3.6 的一部分),释放操作码参数以仅编码单个参数计数,并且 #12844 删除了阻止阻止的编译时检查具有更多参数的代码正在编译。
从 3.7 开始,EXTENDED_ARG()
opcode ,现在完全没有限制你可以使用显式参数传入多少个参数,保存多少个可以放入堆栈(现在由你的内存绑定(bind)):
>>> 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
包罗万象的参数,那么这些 是有限的。
对于 *args
和 **kwargs
调用语法(扩展参数)除了相同的 sys.maxint
大小没有限制Python 标准类型的限制。
在 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重载操作码参数以编码堆栈上的位置参数和关键字参数的数量,每个参数都编码在一个字节中。
关于python - Python 函数中的最大参数数是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/714475/