繁体   English   中英

如何从python中的字符串中删除(真正的)最后一个字符? [即不创建新引用]

[英]How do I remove (for real) the last character from a string in python? [i.e. NOT create a new reference]

注意 - 这与关于此的所有其他问题/答案不同 - 仔细阅读 [如果您不是 100% 确定它有效,请记住在回复之前进行测试]:-

我不想创建对原始对象副本的新引用,减去最后一个字符,我想实际删除最后一个字符。 请参阅此示例:-

def remo(dat):
    for line in dat:
        line=line[:-1] # THIS LINE IS WRONG.  What do I put here?
        print("new line is:"+line)
    return dat

s=['fred','wilma']

n=remo(s);

print(s)
print(n)

如您所见,运行上述命令会返回错误的答案:-

python  demo.py
new line is:fre
new line is:wilm
['fred', 'wilma']
['fred', 'wilma']

实际删除最后一个字符的真正方法是什么?

你不能这样做。 Python 的str在意图和设计上是不可变的。 构成实现细节的例外非常有限(在 CPython 中,当且仅当绑定到mystr的字符串没有其他引用时, mystr += 'abc'才会发生变化),但没有办法使这项工作对于其他任意突变,也不使其在所有 Python 解释器中可移植地工作。 如果您的设计需要可变str ,则您的设计在 Python 中不起作用; 你能做的最好的是写一个str般的类,它实现你所选择的行为,或者满足于用list的长度1 str S,变异的list需要(最终''.join荷兰国际集团就回str ,当你需要一个真正的str )。

当您使用 for 循环时, line 是值的局部变量而不是引用,您必须使用索引来访问原始引用并修改它。 如果您希望原始列表不被修改,那么您可以将列表的副本传递给 remo。

def remo(dat):
    for i in range(len(dat)):
        dat[i] = dat[i][:-1]
        print("new line is: " + dat[i])
    return dat

s = ['fred', 'wilma']
n = remo(s)
print(s)  # ['fre', 'wilm'] since we modified original value.
print(n)  # ['fre', 'wilm']

更新:我找到了答案——所有的 Python 字符串都是不可变的——你永远不能删除最后一个字符。

解决方法是用新引用替换所有引用,如下所示:-

def remo(dat):
    for i in range(0 , len(dat)):
        dat[i]=dat[i][:-1]
        print("new line is:"+dat[i])
    return dat

s=['fred','wilma']

n=remo(s)

print(s)
print(n)

现在可以使用(请注意,它也会修改原始版本):

$ python   demo.py   
new line is:fre
new line is:wilm
['fre', 'wilm']
['fre', 'wilm']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM