python 可变和不可变数据类型

python 是一个完全面向对象的语言,它不是静态类型的。你不需要在使用前声明变量,也不需要声明变量的类型。所有的变量都是对象。“一切皆为对象,一切皆为对象的引用”,可以这样讲变量就是变量(引用),它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。

可变数据类型:列表list和字典dict;不可变数据类型:整型int、字符串型string和元组tuple。

不可变数据类型:

>>> x=1
>>> id(x)
1410614928
>>> y=x
>>> id(y)
1410614928
>>> x+=2
>>> id(x)
1410614960
>>> 

id()查看的是当前变量的地址值,从上面可以看出,x,y的地址是相同的。也就是说它们指向了同一个对象地址,也就是1. 但是后面我们执行了x+=2,这样x就被新建了一个对象3。 原有的对象1,目前还有y在使用。 如果我们再给y重新赋值。则原有的内存1410614928 将没有引用指向它了。它就要被“垃圾回收”。

可变数据类型:

>>> a = ['i','love','you']
>>> id(a)
33373640
>>> a = ['i','love','you']
>>> id(a)
52336360
>>> a.append('too')
>>> id(a)
52336360

这里两个['i','love','you']在内存的地址是不同的。后面是新建的一个对象,它和上面提到的不可变类型是不同的。但是当我们对啊a做添加操作时,可以发现它指向的内存地址不变。引用的地址不变,但是它会扩充地址,改变对象的值。

不可变数据类型,不允许变量的值发生变化。当变的时候,相当于新建对象。

可变数据类型,允许变量的值发生变化,当执行append,+=操作时,不会新建对象,只是地址扩充,改变对象值。引用时不变的。

备注点:

>>> id(888)
49870944
>>> id(888)
49869664

>>> id(2)
1410614944
>>> id(2)
1410614944

这里涉及到python中的小整数对象池的概念。避免为整数频繁申请和销毁内存空间。Python 对小整数的定义是 [-5, 256] 这些整数对象是提前建立好的,不会被垃圾回收。

猜你喜欢

转载自blog.csdn.net/wangweimic/article/details/88658034