我能为input()函数提供多大的输入?

不幸的是,没有简单的方法来测试它.在使用了大量复制粘贴后,我提供的任何输入都不会有input次失败.(我最终放弃了)

input函数的documentation没有提到任何与此相关的内容:

如果存在prompt参数,则将其写入标准输出,而不带尾随换行符.然后,函数从输入中读取一行,将其转换为字符串(go 掉尾随的换行符),并返回该字符串.当读取EOF时,EOFError升高.

所以,我猜没有限制?有人知道有没有,如果有,多少钱?

推荐答案

当然有,它不可能是无限的.我认为文件中需要强调的关键句子是:

[...] 然后,该函数从输入converts it to a string中读取一行(go 掉尾随的换行符)[…]

(强调我的)

由于它将您提供的输入转换为一个Pythonstr对象,因此它本质上会转换为:"其大小has小于或等于Python可以创建的最大字符串".

没有给出显式大小的原因可能是因为这是一个实现细节.对所有其他Python实现强制执行最大大小没有多大意义.

*至少在CPython中,字符串的最大大小取决于其index的允许大小(参见PEP 353).也就是说,当您try 索引时,括号[]中的数字允许有多大:

>>> s = ''
>>> s[2 ** 63]

IndexErrorTraceback (most recent call last)
<ipython-input-10-75e9ac36da20> in <module>()
----> 1 s[2 ** 63]

IndexError: cannot fit 'int' into an index-sized integer

(试试前面的2 ** 63 - 1,这是正的可接受极限,-2 ** 63是负极限.)

对于索引,内部使用的不是Python数字;相反,它是一个Py_ssize_t,分别是32/64位机器上的有符号32/64位整数.所以,从表面上看,这是一个硬限制.

(正如错误消息所述,int和intex-sized integer是两个不同的东西)

在转换之前,如果提供的输入大于PY_SSIZE_T_MAX(最大大小为Py_ssize_t),则看起来也是input() explicitly checks:

if (len > PY_SSIZE_T_MAX) {
    PyErr_SetString(PyExc_OverflowError,
                    "input: input too long");
    result = NULL;
}

然后将输入转换为Python strPyUnicode_Decode.


为你正确看待这一点;如果一本书的平均长度为500.000个字符,而estimation本书的总数量约为1.3亿本,那么理论上可以达到input本左右:

>>> ((2 ** 63) - 1) // 500000 * 130000000
141898

乘以这些字符;不过,这可能需要一些时间:-)(而且首先会受到可用内存的限制!)

Python-3.x相关问答推荐

在多个测试中维护和报告变量

Python3和请求-超文本标记语言:试图抓取一个网站-没有取回真正的超文本标记语言代码

S的两极是什么,相当于大Pandas 的`.ilo‘方法?

为什么 tkinter 在 tkinter 窗口外计算鼠标事件?

Python - 根据条件附加 NULL 值

命名空间前缀无效

aiogram机器人中处理文本输入异常而不是按钮点击的回调函数.

你能骗PIP 让它相信包已经安装了吗

如何提高 snowpark 程序的性能?

删除列表中的第二个出现

Python 3 - 给定未知数量的类别动态地将字典嵌套到列表中

从日志(log)文件中查找延迟最低的用户

命名元组内命名元组的 Python 语法

python 3.7 websockets的1006连接异常关闭错误

Python 异步调试示例

为什么 virtualenv 会有效地禁用 Python 3 制表符补全?

pip install dryscrape 失败并显示错误:[Errno 2] 没有这样的文件或目录:'src/webkit_server'?

如何使用 d.items() 更改 for 循环中的所有字典键?

Python,Docker - ascii编解码器无法编码字符

Beautifulsoup 的单元测试失败