【问题标题】:How is string is immutable and I can replace it in 'python' [closed]字符串如何是不可变的,我可以在“python”中替换它[关闭]
【发布时间】:2020-08-24 08:28:23
【问题描述】:
  1. 我先写一个简单的程序:
s = "Taxi" 
output will be: 
Taxi 
  1. 然后我将第一个索引 (T) 替换为 (S):但在我做任何事情之前,字符串如何是不可变的,我可以替换它,,它是否不可变,因为第一个索引的 id 将采用旧的身份证..

为了说明:

id(T) = 1100
and id(S) = 1100   

【问题讨论】:

  • 看不到 T 是什么。但是是的,str 是不可变的,因为你不能这样做 s[0] = 'M'
  • 您还应该阅读以下内容:nedbatchelder.com/text/names.html
  • "然后我将第一个索引(T)替换为(S):但在我做任何事情之前,字符串如何是不可变的,我可以替换它,,它是不可变的,因为第一个的id index 将采用旧的 id ..” 这甚至意味着什么?请具体。

标签: python


【解决方案1】:

ids 相同的事实意味着它们指向同一个对象。
Python 中的字符串是不可变的,不能分配给它的索引值。



不变性意味着我们可以改变原始对象:

# List is mutable
l = [1, 2, 3]
# That's OK
l[0] = 5
# String is NOT mutable
s = '123'
# That's NOT OK - and WON'T work!
s[0] = '5'




下面的赋值意味着我们创建另一个指针,指向同一个字符串:

S = "Taxi"
T = "Zaxi"
# The following line of code will cause 'S' point on 'T' string
# The string referenced by 'S' before has not changed! (and not available)
S = T
# Assertion will pass, as we changed S to point on T, now they point on same string
assert id(S) == id(T)


字符串不可变这一事实使得基于现有字符串生成新字符串的内存效率低下。
在 C# 中,字符串也是不可变的,有一个名为 StringBuilder 的类可以缓解这种低效率。
关于 Python 中 StringBuilder 的其他替代方法,请阅读此 great thread 了解更多信息。

【讨论】:

  • 这根本没有证明不可变性。尝试使用可变类型,S = [1, 2, 3]T = ['a','b','c']S = T 会给你id(S) == id(T),确实,对于python 对于任何对象 aba = b 将暗示a is b这只是赋值的语义
  • @juanpa.arrivillaga 这正是我写的完全。添加了关于可变性与非可变性含义的更多说明。感谢您的评论。
  • 我想我现在跟着你了,是的。
  • 谢谢你,我是这门语言的初学者,我想知道一切
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
  • 2015-08-05
相关资源
最近更新 更多