鱼C论坛

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

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

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

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

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

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

不可变数据类型例:
>>> string = "abc"
>>> id(string)
24572832
>>> string = string + "d"
>>> string
'abcd'
>>> id(string) # string已不是原来的string,ID已变
63917568
>>> 


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

使用道具 举报

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

使用道具 举报

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

不可变数据类型例:
>>> string = "abc"
>>> id(string)
24572832
>>> string = string + "d"
>>> string
'abcd'
>>> id(string) # string已不是原来的string,ID已变
63917568
>>> 


可变数据类型例:
>>> lst = [1]
>>> id(lst)
64206808
>>> lst.append(2) # 使用list实例对象的append方法来改变其自身
>>> lst
[1, 2]
>>> id(lst) # ID相同,此时lst还是原来的lst,但其值发生了变化
64206808
>>> 
想知道小甲鱼最近在做啥?请访问 -> 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, 2025-1-15 19:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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