Python中变量的进阶知识:

涉及到Python的对象知识。

即:可变对象和不可变对象。题目中的可变和不可变数据类型,表述不准确。

Python中,一切皆对象。

对象是一种抽象。抽象是什么?抽象就是一种概念上的简化。

《learning python》中的一个观点:变量无类型,对象有类型。

对象包括三个元素:ID、Type、Value。

ID:是对象在内存的地址。

Type:是对象的类型。

Value:是对象的值。

以 整数 1 作为对象为例:

1.将对象 1 赋值引用给变量 a:(变量对对象是一种引用)

a = 1

2.不用声明数据类型,python自动识别为整数 int 1。

>>> a=1

>>> type(a)

3.对象 1 此时的 value数值 是1。

4.对象 1 的内存地址(变量引用的内存地址id):

>>> a=1

>>> id(a)

4433791280

所以改变一个对象,有三种方式:改变value值、改变type数据类型、改变id内存地址的引用。

抛开type数据类型,因为数据类型通过int()str()可以直接转换。

只讨论value和id。

不可变对象:是什么不可变呢?

可变对象:是什么可变呢?

上面的对象: 整数 1 ,

可以被无数的变量a,b,c,d,apple,进行赋值引用。

但是,

对象 1 在内存地址的引用却没有变化。

对象本身没有因为变量的赋值引用,而发生任何变化。

所以是不可变对象。

>>> a =1

>>> b =1

>>> c =1

>>> d =1

>>> apple =1

>>> id(a)

4399315248

>>> id(b)

4399315248

>>> id(c)

4399315248

>>> id(d)

4399315248

>>> id(apple)

4399315248

除非新建一个对象 2,

在用变量a,b,c,来赋值引用对象2。

>>> a=2

>>> b=2

>>> c=2

>>> id(a)

4433791312

>>> id(b)

4433791312

对比下对象1 和对象2的内存地址的差别:

>>> id(1)

4433791280

>>> id(2)

4433791312

对象1 和对象2 ,虽然变量各种变化,但是各自的内存地址并未改变。

所以,整数型int 的对象,为不可变对象。

可变对象

对象 :列表 [1,2,3]

可以被无数的变量a,b,c,d,apple,进行赋值引用。

对象 [1,2,3] 和对象 [1,2,3] ,虽然看起来都是对象 [1,2,3] ,但所在内存地址的引用,都不相同。

对象本身看似相同,实则内存地址完全不同(不同变量对看似同一对象的赋值引用到的内存地址不同)。

所以,是可变对象。

>>> a = [1,2,3]

>>> b = [1,2,3]

>>> id(a)

4560147392

>>> id(b)

4518877376

关于可变对象的引用拷贝:

对比两段代码:

>>> a = [1,2,3]

>>> b = [1,2,3]

>>> id(a)

4560147392

>>> id(b)

4518877376

>>> b.append(5)

>>> print(b)

[1, 2, 3, 5]

>>> print(a)

[1, 2, 3]

和代码二:

a=[1,2,3]

>>> b=a

>>> b.insert(0,9)

>>> print(b)

[9, 1, 2, 3]

>>> print(a)

[9, 1, 2, 3]

>>> id(a)

4561102848

>>> id(b)

4561102848

可变对象中,