是否可以在Python中处理任意大的字符串? (通过*运算符创建)

时间:2012-12-27 02:35:53

标签: python string

我们可以使用*运算符构建固定结构但任意长度的字符串,具有以下内容:

length = 10
print "0" * length

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

length = 10000000000000000000000000000000000000000000000
print "0" * length

这会产生OverflowError: cannot fit 'long' into an index-sized integer

我很好奇,这样的配方能否以某种方式用于任意长度的尺寸?或者,处理length未知且可能占用如此大值的情况的正确方法是什么?

2 个答案:

答案 0 :(得分:10)

不,您无法在任何编程语言中创建大型字符串,例如示例中的字符串。字符串包含每个字符。并且10 46 字节最有可能比任何人存储的数据更多。您可以采用超过一万亿的Google数据中心(假设Google有1个存储空间,而且肯定不是这样的情况......)而且磁盘空间要少得多,让单独RAM就是你需要这样一个字符串。

要存储一个巨大的字符串,例如你的示例中的字符串,你必须创建自己的str类似于处理__mul__的类,其中存储重复次数而不实际存储内存中的整个字符串。显然,只要允许修改该字符串,这种实现就会变得非常复杂。

答案 1 :(得分: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. 如果长度很大,则实例化很困难。但是你可以在实例化后进行随机访问。
  4. 在许多情况下,您不必实例化整个字符串。因为您可以使用IO流来进行输入/输出。并使用生成器来处理字符串。所以每次只处理部分数据。

    如果您想了解更多关于long或无限长字符串的信息,您可以学习一些非严格的函数式语言,例如Haskell。它懒洋洋地评估表达。无限列表/字符串通常用于这些语言。