不可变类型与可变类型

不可变类型与可变类型

我搞不懂什么是不变的类型。我知道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方法,则返回一个字典。这个SortedKeyDict带着__new__将其标记为错误。我尝试将整数传递给RoundFloat__new__它没有标记错误。


缥缈止盈
浏览 641回答 3
3回答

MMTTMM

什么?浮标是不变的?但我不能x = 5.0x += 7.0print x # 12.0那不是“哑巴”x吗?你同意字符串是不可变的,对吧?但你也可以做同样的事。s = 'foo's += 'bar'print s # foobar变量的值会发生变化,但它会通过更改变量引用的内容而改变。可变类型可以这种方式改变,而且它可以。也改变“就位”。这就是不同之处。x = something # immutable typeprint xfunc(x)print x # prints the same thingx = something # mutable typeprint xfunc(x)print x # might print something differentx = something # immutable typey = xprint x# some statement that operates on yprint x # prints the same thingx = something # mutable typey = xprint x# some statement that operates on yprint x # might print something different具体实例x = 'foo'y = xprint x # fooy += 'bar'print x # foox = [1, 2, 3]y = xprint x # [1, 2, 3]y += [3, 2, 1]print x # [1, 2, 3, 3, 2, 1]def func(val):    val += 'bar'x = 'foo'print x # foofunc(x)print x # foodef func(val):    val += [3, 2, 1]x = [1, 2, 3]print x # [1, 2, 3]func(x)print x # [1, 2, 3, 3, 2, 1]

慕的地6264312

您必须理解Python将其所有数据表示为对象。其中一些对象(如列表和字典)是可变的,这意味着您可以在不更改其身份的情况下更改它们的内容。其他对象,如整数、浮点数、字符串和元组都是不可更改的对象。了解这一点的一个简单方法是查看对象ID。下面是一个不可变的字符串。你不能改变它的内容。它会引发一个TypeError如果你想改变它。另外,如果我们分配新的内容,就会创建一个新的对象,而不是修改的内容。>>>&nbsp;s&nbsp;=&nbsp;"abc">>>id(s)4702124>>>&nbsp;s[0]&nbsp;'a'>>>&nbsp;s[0]&nbsp;=&nbsp;"o"Traceback&nbsp;(most&nbsp;recent&nbsp;call&nbsp;last): &nbsp;&nbsp;File&nbsp;"<stdin>",&nbsp;line&nbsp;1,&nbsp;in&nbsp;<module>TypeError:&nbsp;'str'&nbsp;object&nbsp;does&nbsp;not&nbsp;support&nbsp;item&nbsp;assignment &nbsp;&nbsp;>>>&nbsp;s&nbsp;=&nbsp;"xyz">>>id(s)4800100>>>&nbsp;s&nbsp;+=&nbsp;"uvw">>>id(s)4800500您可以使用列表来完成此操作,并且它不会更改对象标识。>>>&nbsp;i&nbsp;=&nbsp;[1,2,3]>>>id(i)2146718700>>>&nbsp;i[0]&nbsp;1>>>&nbsp;i[0]&nbsp;=&nbsp;7>>>&nbsp;id(i)2146718700要阅读有关Python数据模型的更多信息,您可以查看Python语言引用:Python 2数据模型Python 3数据模型

浮云间

常见的不可变类型:数字:int(),&nbsp;float(),&nbsp;complex()不可变序列:str(),&nbsp;tuple(),&nbsp;frozenset(),&nbsp;bytes()常见的可变类型(几乎所有其他类型):可变序列:list(),&nbsp;bytearray()设置类型:set()制图类型:dict()类,类实例等。快速测试类型是否可变的一个技巧是使用id()内置功能。示例,在整数上使用,>>>&nbsp;i&nbsp;=&nbsp;1>>>&nbsp;id(i)***704>>>&nbsp;i&nbsp;+=&nbsp;1>>>&nbsp;i2>>>&nbsp;id(i)***736&nbsp;(different&nbsp;from&nbsp;***704)在名单上使用,>>>&nbsp;a&nbsp;=&nbsp;[1]>>>&nbsp;id(a)***416>>>&nbsp;a.append(2)>>>&nbsp;a[1,&nbsp;2]>>>&nbsp;id(a)***416&nbsp;(same&nbsp;with&nbsp;the&nbsp;above&nbsp;id)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python