首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python中字符串替换期间的内存错误

python中字符串替换期间的内存错误
EN

Stack Overflow用户
提问于 2020-04-06 23:46:22
回答 1查看 645关注 0票数 3

我想回答一个关于堆叠溢出的相当简单的问题。原始代码(不是我的):

代码语言:javascript
复制
def to_alternating_case(string):
    for char in string:
        if ord(char) in range(97, 123):
            string.replace(char, string.upper())
        elif ord(char) in range (65,91):
            string.replace(char, string.lower())
        elif ord(char) in range (32, 48):
            continue
        else:
            return '//Non-alphabetical characters are unaffected'
    return string

当然,由于字符串是不可变的,而且string.replace不能更改原始字符串,所以返回值仍然是原始字符串(小写和大写应该由原始程序员的意图交换)。因此,我想提出以下简单的解决办法:

代码语言:javascript
复制
def to_alternating_case(string):
    for char in string:
        if ord(char) in range(97, 123):
            string = string.replace(char, string.upper())
        elif ord(char) in range (65,91):
            string = string.replace(char, string.lower())
        elif ord(char) in range (32, 48):
            continue
        else:
            return '//Non-alphabetical characters are unaffected'
    return string


print(to_alternating_case("Guten Tag"))

但是,我得到的不是新的辛苦赚来的名分和热情的“谢谢”,而是这个例外:

代码语言:javascript
复制
Traceback (most recent call last):
  File "main.py", line 14, in <module>
    print(to_alternating_case("Guten Tag"))
  File "main.py", line 4, in to_alternating_case
    string = string.replace(char, string.upper())
MemoryError

此刻我真的很困惑。怎么一回事?我没有检查数字,所以目前我希望任何字符串-但不是一个MemoryError。

免责声明:是的,我知道原来的问题可以用单线to_alternating_case = lambda s: ''.join(c.lower() if c.isupper() else c.upper() for c in s)解决。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-06 23:51:48

你应该重新考虑这一点:

代码语言:javascript
复制
string = string.replace(char, string.upper())

这将用整个字符串的大写版本替换字符,可能不是您想要的。它会变得非常大,非常快,而且可能会耗尽内存。如果发生这种情况,人们会希望Python会发出某种描述的信号:-)

而且,顺便说一下,你应该非常谨慎地考虑修改当前正在迭代的东西的可能性,这往往会导致项目的双重处理,或者丢失项目,典型的情况是:

代码语言:javascript
复制
for item in someList:
    if item < 0:
        someList.remove(item)

实际上,在代码中并不是这样,因为您只是在开始迭代新对象之后将string重新绑定到一个新对象,但这仍然是一个很好的避免习惯,以防它给您带来了错误的安全感。

在这些情况下(在重要的情况下),最好创建一个新项,然后,在构建之后,以某种方式将其重新分配给原始项。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61070666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档