python变量的可变与不可变类型的深入理解

本文学习于https://blog.csdn.net/lcvcl/article/details/79399754
但是有些不同地方。
首先python变量的都以对象的形式存在于机器的固定内存中。可以用id()函数来判断是否为同一对象。

如声明a=4,则a指向存储4的空间,python通过使用计数器的方式来判断空间的引用情况。当引用计数为0时,则会将内存回收。
其实这可变和不可变对于python来说是不准确的,更为准确的说法是‘是否支持原处修改’。可变与否作为通俗说法。
因为由于python的内存机制,在声明对象的时候,可能会先寻找该对象是否已经被声明过,若被声明(如int和字符串)过,变量会直接指向,不会申请新的内存空间,但是如果变量是其他的类型,可能就要重新申请内存空间了,这个没仔细研究过为什么,待大神解释。
这样在a=4的时候b=4,使用id()函数查看为同一地址(这样的还有字符串),c=[1,2,3,4]的时候d=[1,2,3,4],id()函数查看地址不同。(元组,浮点型,字典等相同内容的变量名引用在内存中地址都不一样)。

python变量分为可变类型和不可变类型

不可变类型(数字、字符串、元组、不可变集合)
可变类型(列表、字典、可变集合)

不可变类型不能直接对其内容进行修改,如字符串’qweqw123’,可以对其进行分割加长的处理(经过如此处理后,python其实是将新的字符串存储到新的内存中),但是不能替换改变其字符串某个字母的内容。
a=4
id(a)
a+=1
id(a)
这两个id是不一样的。说明变量名a重新指向了新的内存地址。

可变类型在声明对象后,是支持在原处修改的。
b=[1,2,3,4]
id(b)
b.append(5)
id(b)
这两个id是一样的。说明变量名b还是指向原来的内存地址。
c=b
id(c)
b.append(6)
id(b)
这两个id也是一样的。因为这是变量名之间的赋值,对比于b=[1,2,3,4]和c=[1,2,3,4],后者是内存赋值给变量名。

你可能感兴趣的:(python)