编程语言
首页 > 编程语言> > 探索 Python 的秘密:可变性、内存和效率之旅

探索 Python 的秘密:可变性、内存和效率之旅

作者:互联网




今天,我们将踏上一段激动人心的旅程,了解 Python 的内部工作原理。我们将揭开可变性和不可变性的层面,探索对象如何存储在内存中,并揭示 Python 的一些有趣的优化技巧。因此,系好安全带,准备好踏上充满见解和启示的旅程吧!

ID 和类型


想象一下:Python 中的每个对象都有其独特的身份和鲜明的个性,我们称之为类型。每个对象都有其在计算机内存中的地址以及一组定义其功能的特征。
```python
x = 5
print(id(x)) # 输出:140719257121760
print(type(x)) # 输出:<class 'int'>
```

可变对象


现在,我们来谈谈可变对象——它们是 Python 世界的变形者!想想列表、字典和集合。您可以添加、删除或更改其中的元素,它们会在不改变其身份的情况下愉快地进行调整。这就像拥有一个粘土球,您可以随心所欲地塑造它!
```python
my_list = [1, 2, 3]
print(id(my_list)) # 输出:140719177831808
my_list.append(4)
print(my_list) # 输出:[1, 2, 3, 4]
print(id( my_list)) # 输出:140719177831808 (还是一样!)
```

不可变对象


另一方面,我们有不可变的物体——比如蒙娜丽莎,不变且永恒。字符串、整数和元组都属于这一类。一旦创建,您就无法对其进行调整。任何修改它们的尝试都会创建一个具有不同身份的全新对象。

```python
my_string = “hello”
print(id(my_string)) # 输出:140719257223280
my_string += “world”
print(my_string) # 输出:hello world
print(id(my_string)) # 输出:140719177777680 (新身份) !)
```

不可变对象如何存储在内存中


Python 中的不可变对象作为单独的实体存储在内存中。当您修改不可变对象时,Python 将创建一个具有更新值的新对象,而原始对象保持不变。

为什么它很重要以及 Python 如何区别对待它们?

现在,为什么这一切都很重要?Python 以不同的方式对待可变对象和不可变对象,尤其是在内存管理和变量分配方面。可变对象允许就地更改,而不可变对象通过在修改时创建新副本来保持其完整性。

赋值与引用


赋值涉及给对象命名,而引用则涉及指向现有对象。在 Python 中,变量只是引用对象的名称,因此当您为变量分配值时,您正在引用保存该值的对象。

将参数传递给函数


当您将参数传递给 Python 中的函数时,您传递的是对对象的引用,而不是对象本身。这有一些令人难以置信的含义!即使函数结束后,对函数内可变对象所做的更改也会保留,而不可变对象仍保持原始状态。
```python

def modify_list(lst):
lst.append(4)

my_list = [1, 2, 3]
修改_list(my_list)
print(my_list) # 输出:[1, 2, 3, 4]

```

整数预分配


默认的 Python 解释器 CPython 预分配前 262 个整数(从 -5 到 256)以提高性能和内存使用率。这些整数在解释器启动时创建,并在程序执行过程中重复使用。

别名和 |NSMALLPOSINTS| 的机制 /|NSMALLNEGINTS|

Python 中的别名是引用同一对象的多个名称。让我们通过 |NSMALLPOSINTS| 来重点关注 Python 的优化能力 和|NSMALLNEGINTS|。这些常量表示解释器启动期间预先分配的小正整数和负整数的数量。这些整数的范围从 -5 到 256,是 Python 程序的主力,经常使用并且针对性能进行了高度优化。

为什么这些价值观很重要?


您可能想知道为什么有这些特定值。这些整数是 Python 程序中最常用的整数。通过为它们预先分配内存,Python 优化了内存使用并增强了性能,确保经常使用的整数值可以立即可用。

结论


当我们结束 Python 内部工作原理的旅程时,我们发现了它的一些最有趣的秘密。从可变性和不变性的动态舞蹈到 |NSMALLPOSINTS| 背后的巧妙优化 和 |NSMALLNEGINTS|,Python 以其优雅和高效让我们眼花缭乱并给予我们启发。

因此,下次编写 Python 代码时,请记住表面之下的魔力 — 内存中对象的复杂舞蹈、可变性和不变性的仔细平衡,以及使 Python 成为强大工具的巧妙优化。

标签:print,可变性,内存
来源: