了解内存管理可以帮助您编写高效的Python代码。尽管您可能无法控制内存分配,但您可以优化程序以更好地分配内存。在深入研究之前,请记住:在Python中,一切都是对象。与C、C++或Java不同,值存储在内存中,变量指向该内存位置。C中的内存分配在python中,整个对象存储在内存中,对象可以是整数,字符串或列表,以及指向对象的变量。使困惑?要理解,让我们了解python对象的作用!内存中的PyObject:类型:整数、字符串、浮点数等引用计数:绑定到对象的引用数值:value/data/infoPyObject(a=200)所以每当你创建一个变量(比如a=200),将在内存中创建一个新的PyObject,其引用计数设置为1,变量“a”指向它。但什么是引用计数?让我们举个例子来理解它。我们有一个值为200的整数类型变量“a”。假设我需要另一个名为“b”的整数类型变量,值为200。你已经创建了两个这样的变量所以,你已经创建了两个这样的变量a=200b=200现在,您可能会猜到,对于变量“a”和“b”,内存中必须有2个对象。但事实并非如此。“a”和“b”指向同一个对象。变量a和b引用同一个PyObject让我们通过Python代码验证这一点。>>>a=1>>>b=1>>>c=2>>>id(a)94147440556736>>>id(b)94147440556736>>>id(c)94147440556768>>>如你所见,变量“a”和“b”具有相同的id(内存位置),因此代表相同的对象,而c具有不同的id值。所以目前内存中有两个python对象。现在,如果我们为“a”分配一个新值,即a=3。>>>a=3>>>id(a)94147440556800>>>id(b)94147440556736>>>现在,“a”指向一个新对象,而“b”仍然指向同一个对象。但是让我们考虑这个例子。>>>a=1>>>b=a>>>id(a)94147440556736>>>id(b)94147440556736>>>在这个例子中a=1但"b"的值为"a"。当我们改变“a”的值时,是否也会影响“b”?让我们来看看。>>>a=1>>>b=a>>>id(a)94147440556736>>>id(b)94147440556736>>>a=3>>>id(a)94147440556800>>>id(b)94147440556736>>>“a”现在指向新对象,但“b”仍然指向旧对象。但为什么?因为“b”并不是直接指向变量“a”,而是指向变量“a”的对象。这就是引用计数所做的,它跟踪指向它的变量的数量。另一个有趣的问题是,如果PyObject的引用计数变为零会发生什么?在此之前,让我们了解如何删除对对象的引用。1、delPython内置的del关键字可以帮助我们删除这些对对象的引用。其实有人认为del是把对象从内存中删除,其实不然。所以你可以使用del删除这样的引用。>>>a=2>>>id(a)94147440556768>>>dela2,outofrange一旦超出范围,对该对象的引用将被自动删除。>>>defscope():...x=1...print(id(x))...>>>scope()94147440556736>>>我们以上面的代码为例,变量“x”scope()函数中对象的ref计数是+1,但是当解释器离开这个函数的作用域时,PyObject的ref计数会减1,因为“x”是局部变量,只有作用域其功能。这也是python不鼓励使用全局变量的原因之一,因为全局范围内的变量可以适用于整个程序。3.将新对象分配给变量当将新对象分配给现有变量时。前一个对象的引用计数减1。>>>a=1>>>id(a)94147440556736>>>a=2>>>id(a)94147440556768>>>现在,回到上一个问题,当对象的引用计数为0时会发生什么。它留在记忆中吗?一旦一个对象的引用计数变为0,它就会被垃圾收集器从内存中删除。本文仅供学习,版权归原作者所有。如有侵权,请联系删除。学习Python的路上肯定会遇到困难,不要慌张,我这里有一套学习资料,包括40+电子书,800+教学视频,涉及Python基础、爬虫、框架、数据分析、机学习等等,别怕你学不会!https://shimo.im/docs/JWCghr8...《Python学习资料》关注公众号【蟒圈】,每日优质文章推送。
