为了账号安全,请及时绑定邮箱和手机立即绑定

不可变类型与可变类型

不可变类型与可变类型

缥缈止盈 2019-06-03 13:31:53
不可变类型与可变类型我搞不懂什么是不变的类型。我知道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__它没有标记错误。
查看完整描述

3 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

什么?浮标是不变的?但我不能


x = 5.0

x += 7.0

print x # 12.0

那不是“哑巴”x吗?


你同意字符串是不可变的,对吧?但你也可以做同样的事。


s = 'foo'

s += 'bar'

print s # foobar

变量的值会发生变化,但它会通过更改变量引用的内容而改变。可变类型可以这种方式改变,而且它可以。也改变“就位”。


这就是不同之处。


x = something # immutable type

print x

func(x)

print x # prints the same thing


x = something # mutable type

print x

func(x)

print x # might print something different


x = something # immutable type

y = x

print x

# some statement that operates on y

print x # prints the same thing


x = something # mutable type

y = x

print x

# some statement that operates on y

print x # might print something different

具体实例


x = 'foo'

y = x

print x # foo

y += 'bar'

print x # foo


x = [1, 2, 3]

y = x

print 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 # foo

func(x)

print x # foo


def 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]


查看完整回答
反对 回复 2019-06-03
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

您必须理解Python将其所有数据表示为对象。其中一些对象(如列表和字典)是可变的,这意味着您可以在不更改其身份的情况下更改它们的内容。其他对象,如整数、浮点数、字符串和元组都是不可更改的对象。了解这一点的一个简单方法是查看对象ID。

下面是一个不可变的字符串。你不能改变它的内容。它会引发一个TypeError如果你想改变它。另外,如果我们分配新的内容,就会创建一个新的对象,而不是修改的内容。

>>> s = "abc">>>id(s)4702124>>> s[0] 'a'>>> s[0] = "o"Traceback (most recent call last):
  File "<stdin>", line 1, in <module>TypeError: 'str' object does not support item assignment
  >>> s = "xyz">>>id(s)4800100>>> s += "uvw">>>id(s)4800500

您可以使用列表来完成此操作,并且它不会更改对象标识。

>>> i = [1,2,3]>>>id(i)2146718700>>> i[0] 1>>> i[0] = 7>>> id(i)2146718700

要阅读有关Python数据模型的更多信息,您可以查看Python语言引用:


查看完整回答
反对 回复 2019-06-03
?
浮云间

TA贡献1829条经验 获得超4个赞

常见的不可变类型:

  1. 数字:

    int()float()complex()

  2. 不可变序列:

    str()tuple()frozenset()bytes()

常见的可变类型(几乎所有其他类型):

  1. 可变序列:

    list()bytearray()

  2. 设置类型:

    set()

  3. 制图类型:

    dict()

  4. 类,类实例
  5. 等。

快速测试类型是否可变的一个技巧是使用id()内置功能。

示例,在整数上使用,

>>> i = 1>>> id(i)***704>>> i += 1>>> i2>>> id(i)***736 (different from ***704)

在名单上使用,

>>> a = [1]>>> id(a)***416>>> a.append(2)>>> a[1, 2]>>> id(a)***416 (same with the above id)


查看完整回答
反对 回复 2019-06-03
  • 3 回答
  • 0 关注
  • 640 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信