6

我们可以使用 * 运算符构建固定结构但任意长度的字符串,如下所示:

length = 10
print "0" * length

这将返回预期的结果,0000000000。当长度过大时会出现问题,导致溢出错误:

length = 10000000000000000000000000000000000000000000000
print "0" * length

这导致OverflowError: cannot fit 'long' into an index-sized integer.

我很好奇,这样的公式可以以某种方式用于任意长度的尺寸吗?length或者,处理未知且可能具有如此大价值的场景的正确方法是什么?

4

2 回答 2

10

不,您不能在任何编程语言中创建像示例中那样的大字符串。字符串单独包含每个字符。10 46字节很可能比任何人存储的数据都多。您可以使用超过一万亿个 Google 数据中心(假设 Google 有 1 YiB 的存储空间,这肯定还不是这样。)并且磁盘空间仍然少得多,更不用说 RAM 了,这将是您对这样一个字符串所需要的.

要存储一个像您的示例中那样的巨大字符串,您必须创建自己str的类,该类__mul__以存储重复次数而不实际将整个字符串存储在内存中的方式进行处理。显然,一旦您允许对该字符串进行修改,此实现就会变得非常复杂。

于 2012-12-27T02:40:53.393 回答
3

你可以在 python 中编写类似字符串生成器的东西。例如:

import sys

def stringWithArbitraryLength(stringLength):
    n = 0
    while n < stringLength:
        # pattern here
        if n % 2 == 0:
            yield "0"
        else:
            yield "1"
        n += 1

Infinity = float('inf')

# Usage 1: print the long string
# for c in stringWithArbitraryLength(Infinity):
#   sys.stdout.write(c)

# Usage 2: instantiate the long string
soLong = stringWithArbitraryLength(100000)  # output 01010101....
print ''.join(soLong)

# Usage 3: transform the long string
def transformString(longLongString):
    for c in longLongString:
        if c == "1":
            yield "X"
        else:
            yield c
soLong2 = stringWithArbitraryLength(100000)  # output 0X0X0X0X....
print ''.join(transformString(soLong2))

它有几个限制:

  1. 它只允许顺序访问,不允许随机访问。所以你必须使用for循环来遍历字符串。
  2. 每个字符不能依赖于具有较大索引的字符。
  3. 如果长度很大,实例化很困难。但是您可以在实例化后进行随机访问。

在许多情况下,您不必实例化整个字符串。因为您可以使用 IO 流进行输入/输出。并使用生成器处理字符串。所以每次你只处理部分数据。

如果你想了解更多关于长或无限长的字符串,你可以学习一些非严格的函数式语言,例如 Haskell。它懒惰地评估表达式。这些语言中经常使用无穷大列表/字符串。

于 2012-12-27T03:01:31.390 回答