我搞不清什么是不可变类型。我知道float
对象被认为是不可变的,我的书中有这样一个例子:
class RoundFloat(float):
def __new__(cls, val):
return float.__new__(cls, round(val, 2))
是否因为类结构/层次结构而认为这是不可变的?,这意味着float
位于类的顶部,并且是它自己的方法调用。类似于这种类型的例子(尽管我的书中说dict
是可变的):
class SortedKeyDict(dict):
def __new__(cls, val):
return dict.__new__(cls, val.clear())
而可变的东西在类中有方法,例如:
class SortedKeyDict_a(dict):
def example(self):
return self.keys()
另外,对于最后一个class(SortedKeyDict_a)
,如果我将这种类型的集合传递给它:
d = (('zheng-cai', 67), ('hui-jun', 68),('xin-yi', 2))
不调用example
方法,它返回一个字典。带有__new__
的SortedKeyDict
将其标记为错误。我试着用__new__
将整数传递给RoundFloat
类,它没有标记错误。
通用不可变类型:
int()
,float()
,complex()
str()
,tuple()
,frozenset()
,bytes()
常见的可变类型(几乎所有其他类型):
list()
,bytearray()
set()
dict()
快速测试类型是否可变的一个技巧是使用
id()
内置函数。例如,在整数上使用
在列表中使用
您必须理解Python将其所有数据表示为对象。其中一些对象(如列表和词典)是可变的,这意味着您可以在不更改其标识的情况下更改其内容。其他对象如整数、浮点数、字符串和元组是不能更改的对象。 理解这一点的一个简单方法是查看对象ID
下面是一个不可变的字符串。你不能改变它的内容。如果您尝试更改它,它将引发一个
TypeError
。此外,如果我们分配新内容,则会创建一个新对象,而不是正在修改的内容。你可以用一个列表来做,它不会改变对象的标识
要阅读有关Python数据模型的更多信息,可以查看Python语言参考:
什么?浮动是不可变的?但我不能
那不是“mut”x吗?
你同意字符串是不可变的对吧?但你也可以做同样的事。
变量的值会改变,但它会通过改变变量引用的内容而改变。可变类型可以改变这种方式,它也可以改变“就地”。
这就是区别。
具体实例
相关问题 更多 >
编程相关推荐