Python中的对象
在Python中,一切都是对象。为了证明,你可以打开一个REPL并探索使用isinstance():
>>> isinstance(1, object) True >>> isinstance(list(), object) True >>> isinstance(True, object) True >>> def foo(): ... pass ... >>> isinstance(foo, object) True
此代码向您显示Python中的所有内容确实是一个对象。每个对象至少包含三个数据:
参考计数、类型、值
该引用计数为内存管理。要深入了解Python中的内存管理内部。
该类型在CPython层使用,以确保运行时的类型安全性。最后,有值,即与对象关联的实际值。
但并非所有对象都是相同的。您还需要了解另一个重要的区别:不可变对象和可变对象。理解对象类型之间的差异确实有助于阐明Python中的指针。
不可变对象和可变对象
在Python中,有两种类型的对象:
无法更改的不可变对象、可以改变的可变对象。
理解这种差异是在Python中学习指针的第一个关键。以下是常见类型的细分以及它们是否可变或不可变:
Type Immutable? int Yes float Yes bool Yes complex Yes tuple Yes frozenset Yes str Yes list No set No dict No
如您所见,许多常用的基元类型是不可变的。您可以通过编写一些Python来证明这一点。您需要Python标准库中的一些工具:
id() 返回对象的内存地址。
isTrue当且仅当两个对象具有相同的内存地址时才返回。
再一次,您可以在REPL环境中使用它们:
>>> x = 5 >>> id(x) 94529957049376
在上面的代码中,已分配的值5来x。如果您尝试使用add修改此值,那么您将获得一个新对象:
>>> x + = 1 >>> x 6 >>> id (x ) 94529957049408
即使上面的代码似乎修改了值x,你也会得到一个新对象作为响应。
该str类型也是不变的:
>>> s = "real_python" >>> id(s) 140637819584048 >>> s += "_rocks" >>> s 'real_python_rocks' >>> id(s) 140637819609424
同样,操作后s最终会有不同的内存地址+=。
对于某些对象list,+=将转换为__iadd__()(就地添加)。这将修改self并返回相同的ID。但是,str并int没有这些方法而导致__add__()调用而不是__iadd__()。
试图直接改变字符串会s导致错误:
>>> s[0] = "R" Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'str' object does not support item assignment
上面的代码失败了,Python表明它str不支持这种突变,这与该str类型是不可变的定义一致。
与可变对象形成对比,例如list:
>>> my_list = [1, 2, 3] >>> id(my_list) 140637819575368 >>> my_list.append(4) >>> my_list [1, 2, 3, 4] >>> id(my_list) 140637819575368
此代码显示了两种类型对象的主要区别。my_list最初有一个id。即使在4附加到列表后,my_list也具有相同的 ID。这是因为list类型是可变的。
证明列表可变的另一种方法是赋值:
>>> my_list[0] = 0 >>> my_list [0, 2, 3, 4] >>> id(my_list) 140637819575368
在此代码中,您my_list将其第一个元素变异并设置为0。但是,即使在此分配之后,它仍保持相同的ID。随着可变和不可变对象的出现,的下一步是理解Python的变量生态系统。
【Python中的变量】
神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试