鱼C论坛

 找回密码
 立即注册
查看: 1093|回复: 4

[已解决]String为何不可变?

[复制链接]
发表于 2021-5-16 16:10:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
学习了小甲鱼老师的零基础入门学习python第041讲:魔法方法:构造和析构,如果继承String,同时 要进行一些改动的时候要重写__new__方法而不是__init__方法。现在有个疑问,就是为什么String就不可以变呢?
最佳答案
2021-5-16 16:35:09
字符串str属于Python中的不可变数据类型,str实例对象没有改变自身的方法,只能通过重新赋值来获得另一个字符串,但重新赋值后就变成另一个实例对象了,已不是原来的对象。

不可变数据类型例:
  1. >>> string = "abc"
  2. >>> id(string)
  3. 24572832
  4. >>> string = string + "d"
  5. >>> string
  6. 'abcd'
  7. >>> id(string) # string已不是原来的string,ID已变
  8. 63917568
  9. >>>
复制代码



可变数据类型例:
  1. >>> lst = [1]
  2. >>> id(lst)
  3. 64206808
  4. >>> lst.append(2) # 使用list实例对象的append方法来改变其自身
  5. >>> lst
  6. [1, 2]
  7. >>> id(lst) # ID相同,此时lst还是原来的lst,但其值发生了变化
  8. 64206808
  9. >>>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-16 16:33:10 | 显示全部楼层
官方文档说了:字符串是由 Unicode 码位构成的不可变 序列
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-16 16:35:09 | 显示全部楼层    本楼为最佳答案   
字符串str属于Python中的不可变数据类型,str实例对象没有改变自身的方法,只能通过重新赋值来获得另一个字符串,但重新赋值后就变成另一个实例对象了,已不是原来的对象。

不可变数据类型例:
  1. >>> string = "abc"
  2. >>> id(string)
  3. 24572832
  4. >>> string = string + "d"
  5. >>> string
  6. 'abcd'
  7. >>> id(string) # string已不是原来的string,ID已变
  8. 63917568
  9. >>>
复制代码



可变数据类型例:
  1. >>> lst = [1]
  2. >>> id(lst)
  3. 64206808
  4. >>> lst.append(2) # 使用list实例对象的append方法来改变其自身
  5. >>> lst
  6. [1, 2]
  7. >>> id(lst) # ID相同,此时lst还是原来的lst,但其值发生了变化
  8. 64206808
  9. >>>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-16 16:49:21 | 显示全部楼层
我派生字符串属性的时候重写的时候没管new 直接重写init没事啊  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-16 20:04:50 | 显示全部楼层
hrp 发表于 2021-5-16 16:35
字符串str属于Python中的不可变数据类型,str实例对象没有改变自身的方法,只能通过重新赋值来获得另一个字 ...

谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 07:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表