我们可以使用*运算符构建固定结构但任意长度的字符串,具有以下内容:
length = 10
print "0" * length
返回预期的内容0000000000
。当长度过大时会出现问题,导致溢出错误:
length = 10000000000000000000000000000000000000000000000
print "0" * length
这会产生OverflowError: cannot fit 'long' into an index-sized integer
。
我很好奇,这样的配方能否以某种方式用于任意长度的尺寸?或者,处理length
未知且可能占用如此大值的情况的正确方法是什么?
答案 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))
它有几个限制:
在许多情况下,您不必实例化整个字符串。因为您可以使用IO流来进行输入/输出。并使用生成器来处理字符串。所以每次只处理部分数据。
如果您想了解更多关于long或无限长字符串的信息,您可以学习一些非严格的函数式语言,例如Haskell。它懒洋洋地评估表达。无限列表/字符串通常用于这些语言。