在 Python 3.7 及更高版本中,没有限制。这是issue #27213 和issue #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 包罗万象的参数,那么这些是 受限的。
对于 *args 和 **kwargs 调用语法(扩展参数),除了 Python 标准类型的相同 sys.maxint 大小限制外,没有其他限制。
在 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 重载了操作码参数以对堆栈上的位置参数和关键字参数的数量进行编码,每个参数都编码为一个字节。