在Python
3.7和更高版本中,没有限制。这是在问题#27213和问题#12844中完成的工作的结果;#27213重新设计了
CALL_FUNCTION*操作码系列,以提高性能和简化性(3.6的一部分),释放了操作码参数以仅对单个参数计数进行编码,并且#12844删除了编译时检查,该检查防止了带有更多参数的代码无法编译。
因此,从3.7开始,使用
EXTENDED_ARG()oppre,现在可以使用显式参数传递多少个参数,保存多少可以装入堆栈(现在受内存 限制)就完全没有限制 :
>>> import sys>>> sys.version_infosys.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 1SyntaxError: more than 255 arguments之所以存在此限制,是因为直到Python
3.5,
CALL_FUNCTION操作码都将操作码参数重载以对堆栈上的位置参数和关键字参数的数量进行编码,每个参数都编码为一个字节。



