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
可变对象中,