当前位置: 首页 > 面试题库 >

Python函数中最大参数个数是多少?

史逸春
2023-03-14
问题内容

众所周知,Python函数最多可以包含256个参数。我很好奇的是,此限制是否适用*args以及**kwargs何时按以下方式展开它们:

items = [1,2,3,4,5,6]

def do_something(*items):
    pass

我问是因为,假设地,在某些情况下,大于256个项目的列表可能会以*args或的形式展开**kwargs


问题答案:

在Python
3.7和更高版本中,没有限制。这是在问题#27213和问题#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所有参数,则这些
元素将 受到限制。

对于*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 1
SyntaxError: more than 255 arguments

之所以存在此限制,是因为直到Python
3.5,CALL_FUNCTION操作码都将操作码参数重载以对堆栈上的位置参数和关键字参数的数量进行编码,每个参数都编码为一个字节。



 类似资料:
  • 问题内容: 我最近一直在复制和移动大量文件(约40万个)。我知道在Bash命令行上可以扩展的参数数量有限制,因此我一直在使用xargs来限制产生的数量。 出于好奇,我想知道我可以使用的最大参数数目是多少,我发现这篇文章说它是依赖于系统的,我可以运行以下命令来找出: 令我惊讶的是,我回来的答案是: 刚刚超过 260万 。正如我所说,我要处理的文件数量要少得多,大约为40万。我绝对需要使用移动和复制这

  • java中vararg可以使用的最大参数数是多少?我相信应该是有限度的,不是无限的。

  • 问题内容: 在python中,我有一个具有许多参数的函数。我想将此函数适合数据集,但只使用一个参数,其余的参数我要自己提供。这是一个例子: 在这种情况下,我希望只对它进行拟合,并且参数采用循环变量的值。如何才能做到这一点? 问题答案: 您可以包装一个lambda,如下所示: Lambda是一个匿名函数,在Python中只能用于简单的单行函数。基本上,通常在不需要为函数分配名称时通常用于减少代码量。

  • 问题内容: 评估为nan 评估为1 这是预期的行为吗? 感谢您的回答。 当iterable为空时引发异常。为什么Python出现时不引发异常?或者至少做一些有用的事情,例如return或ignore 。当前的行为非常不安全,似乎完全不合理。 问题答案: In [19]: 1>float(‘nan’) Out[19]: False 浮点数不得大于或小于整数。 首先选择第一个元素,然后仅在找到严格更大

  • 我正在用PowerShell编写一个脚本,在某个时候我需要在函数参数上使用ValidateSet。这是一个非常好的功能,但我需要的是更多的东西。 例如: 因此,此代码段允许我从列表中选择一个项目,如 然后将其打印到屏幕上。我想知道是否有可能允许选择多个值并将它们传递给来自一个验证集的函数,如下所示 也许有一个图书馆,或者我只是错过了一些东西,但我真的找不到一个解决方案。

  • 问题内容: 我需要某种方法来使用pool.map()中的一个函数,该函数接受多个参数。根据我的理解,pool.map()的目标函数只能有一个可迭代的参数,但是有没有办法我也可以传入其他参数呢?在这种情况下,我需要传递一些配置变量,例如Lock()并将信息记录到目标函数中。 我试图做一些研究,我认为我也许可以使用部分函数来使其工作?但是,我不完全了解这些工作原理。任何帮助将不胜感激!这是我要执行的简