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

标签 python function arguments language-features limit

众所周知,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/

相关文章:

Swift 在传递可变数量的参数时出现问题

python - tensorflow 2.0 : An op outside of the function building code is being passed

python - 解析可选的范围列表

c++ - 在 C++ 中描述什么是虚函数的最简洁但准确的方法是什么?

bash - 如何从 shell 脚本中获取倒数第二个参数?

javascript - setTimeout 拒绝向回调发送参数

python - 如何格式化 Pandas 数据框的 IPython html 显示?

python - python中不能 'import time',得到 'AttributeError: struct_time'如何解决?

Javascript - 在函数参数中返回另一个函数

c++ - 如何从函数内部修改作用域变量?