首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >capitalize函数的Python内存错误

capitalize函数的Python内存错误
EN

Stack Overflow用户
提问于 2016-02-24 13:05:37
回答 3查看 131关注 0票数 0

我是python的新手,我想写一个函数,它接受一个字符串并返回该字符串所有可能的大小写的列表。这就是它:

代码语言:javascript
复制
def transform_capitalize(st):
    l=[]
    l.append(st.lower())
    newl=l
    length=len(st)
    for x in range(0,length):
        for i in l:
            newl.append(i[:x]+i[x].upper()+i[(x+1):])
        l=newl
    return l

逻辑如下:

获取字符串并转换为小写转换,然后放入列表中,然后在循环中进行循环,获取每个字母为大写的可能性,一次一个,并在每个字母位置之后更新列表。

Foo为例,l=['foo'],长度为3,因此从0到2,取列表中的每个元素,并将第i个位置的字母大写,将这些字母附加到newl,然后在该位置的所有大写完成后更新列表,因此当i =0时,列表的末尾应为["foo","Foo"]

对于i =1,它应该是["foo","Foo""fOo","FOo"];对于2,它应该是['foo', 'Foo', 'fOo', 'FOo', 'foO', 'FoO', 'fOO', 'FOO']。顺序并不重要,但更多的原因是我得到了一个内存错误,所以我假设它是一个无限循环。

有人能告诉我出了什么问题吗?

EN

回答 3

Stack Overflow用户

发布于 2016-02-24 13:14:02

这两行就是问题所在:

代码语言:javascript
复制
newl=l
l = newl

当您为变量分配数组时,默认行为是让变量充当引用,而不是副本。这意味着,如果您为a分配一个空列表,那么您将a分配给b,将任何内容附加到ba都是相同的。

代码语言:javascript
复制
a = []
b = a
b.append("hello")
print(a) # prints ["hello"]

要在python中复制数组,可以使用切片:

代码语言:javascript
复制
a = []
b = a[:] #here
b.append("hello")
print(a) # prints []

现在,在需要时将引用赋值更改为复制:

代码语言:javascript
复制
def transform_capitalize(st):
    l=[]
    l.append(st.lower())
    newl=l[:]
    length=len(st)
    for x in range(0,length):
        for i in l:
            newl.append(i[:x]+i[x].upper()+i[(x+1):])
        l=newl[:]
    return l
transform_capitalize("hello"); #['hello', 'Hello', 'hEllo', 'HEllo', 'heLlo', 'HeLlo', 'hELlo', 'HELlo', 'helLo', 'HelLo', 'hElLo', 'HElLo', 'heLLo', 'HeLLo', 'hELLo', 'HELLo', 'hellO', 'HellO', 'hEllO', 'HEllO', 'heLlO', 'HeLlO', 'hELlO', 'HELlO', 'helLO', 'HelLO', 'hElLO', 'HElLO', 'heLLO', 'HeLLO', 'hELLO', 'HELLO']
票数 4
EN

Stack Overflow用户

发布于 2016-02-24 13:27:03

也可以使用递归解决方案:

代码语言:javascript
复制
def transform_capitalize(st):
  result = []
  if len(st) > 0:
     head = st[0]
     tails = transform_capitalize(st[1:])
     for t in tails:
       result.append( head.lower() + t )
       result.append( head.upper() + t )
  else:
    result = [ '' ]
  return result

给定一个空字符串,它将返回一个空字符串。如果这不是我们想要的(通过将停止条件的长度设置为1而不是0),可以对其进行修改。

票数 0
EN

Stack Overflow用户

发布于 2016-02-24 13:38:49

我很无聊,所以这里是你的函数的一个“包含电池”的版本:

代码语言:javascript
复制
from itertools import product
from string import upper, lower

def capitalize(word):
    word = word.lower()
    for p in product([upper, lower], repeat=len(word)):
        yield ''.join(fn(letter) for fn, letter in zip(p, word))

if __name__=='__main__':
    print list(capitalize('foo'))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35593676

复制
相关文章

相似问题

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