关于python变量与内存的探讨

本章基于python37,解释器cpython,win10系统

python是解释器语言,执行前必须一行一行的解释,python源代码中,任何非解释性(对代码进行补充说明的)的显示代码,均会被python解释器解释,在python源代吗中直接输入-----csdn是真的****

b=3 print(id(b)) print(id(3))这样输入,得到结果140719108112208,140719108112208,这这里id函数里面直接输入了3,却得到了一个内存地址,这说明什么,说明3被解释器解释和分配了内存,看下一个例子,不仅仅id直接到到了字符串123的内存地址,并且,两个变量的内存地址一致

c="123" d="123"print(id(c))print(id(d)) 3140760447552 3140760447552 3140760447552
,直接说结论吧,自己慢慢理解才能理解的
,在python 中例如def fun():pass print(id(fun())) print(id(fun)) 140719204505616 1687678669416,不管点击多少次,不管以怎样的频率,最终结果是一样的,一个显而易见的结果可以得出:python的内存是一开始是分配的,是固定的,for i in range(1000000) print(id(i))这是我输出一百万次后,我这边炸了1785782786864 1785782786800 1785782786864 1785782786800 1785782786864
1785782786800 1785782786864 1785782786800
1785782786864
1785782786800
1785782786864
1785782786800
1785782786864
1785782786800
1785782786864
1785782786800
1785782786864

5782786800
1785782786864这是我开始炸的风水岭--(不服可以试试,任何电脑都会炸,只是上限问题)

观察最后是分别是在两个位置之间轮流输出,

他的源码我占时看不懂,但大致上明白了,1解释器对内存是有分区的,2一般解释器源代码常用值(显示值)的内存是固定的,变量只是一个数学意义上的指针,相当于x=2,x不管怎么变,也不会改变2的值 3在不改变解释器源码的情况下--(通过某些库也算),显示值和内存基本上可以说是一一对应,某种情况下的 一一对应 4变量名类似为指针,但不能改变其存储的值在不借助外部模块和内部源码改变的情况下,5但是, 要知道内存是有限的,而可以创造的值是无限的,比如d =10**1000 print(id(d) 2462034576824 1732387554744。。。这近乎是一个无限大的数,对比一万以内数而言,每次输出其id时,均不一样,之前已经说了id是指针,那么这就意味着对于其源码没有给详细定位的数,这肯定不是显示值,暂且分为非显示值,我们不需要弄清楚其非显示值的内存分配原理。但我们可以清楚的得到一个结论,对于非显示值--超出了内存一一分配的值,不接受一一原则,可以理解为当id随时变换时,这个值为非显示值,在内存里不存在具体的应该被分配的内存地址

6关于内存的回收可以自行理解其他文章,

def fun():
    pass
def fun2():
    pass
print(id(fun()))
print(id(fun2())
print(fun() is fun2())

140719204505616
140719204505616
True

def fun3():
    return 1
print(id(fun3()))
print(id(1))

140719204974352
140719204974352

我觉得这会更加直观的体现外表的值和python"指针"(变量名)的关系所以贴上来了

真的想深入研究可以去理解解释器的源码

猜你喜欢

转载自blog.csdn.net/qq_42395490/article/details/81259936
今日推荐