[英]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.