当然有,不能无限*。我认为需要强调的文档中的关键语句是:
[...] 然后该函数从输入中读取一行,将其转换为字符串(去除尾随的换行符)[...]
(强调我的)
由于它将您提供的输入转换为 Python str 对象,因此它本质上转换为:“其大小必须小于或等于最大字符串Python可以创建”。
没有给出明确大小的原因可能是因为这是一个实现细节。对 Python 的所有其他实现强制执行最大大小没有多大意义。
*至少在 CPython 中,字符串的最大大小取决于其 index 允许的大小(请参阅PEP 353)。也就是当你尝试索引时,括号[]中的数字允许多大:
>>> 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。所以,这就是看起来的硬性限制。
(如错误消息所述,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
乘以这些字符;不过,这可能会花费您一些时间 :-)(而且您首先会受到可用内存的限制!)