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