我能为input()
函数提供多大的输入?
不幸的是,没有简单的方法来测试它.在使用了大量复制粘贴后,我提供的任何输入都不会有input
次失败.(我最终放弃了)
input
函数的documentation没有提到任何与此相关的内容:
如果存在
prompt
参数,则将其写入标准输出,而不带尾随换行符.然后,函数从输入中读取一行,将其转换为字符串(go 掉尾随的换行符),并返回该字符串.当读取EOF时,EOFError
升高.
所以,我猜没有限制?有人知道有没有,如果有,多少钱?
我能为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 str
和PyUnicode_Decode
.
为你正确看待这一点;如果一本书的平均长度为500.000
个字符,而estimation本书的总数量约为1.3亿本,那么理论上可以达到input
本左右:
>>> ((2 ** 63) - 1) // 500000 * 130000000
141898
乘以这些字符;不过,这可能需要一些时间:-)(而且首先会受到可用内存的限制!)