Python中的变量都是对象,是对地址和内存的抽象。可以把变量当成“指针”来理解,变量存的是值的地址,不是变量本身。
举个例子: a = 2
变量 a 里面真实存的是2在内存中的地址,而不是2这个数值。
有了这个认识我们看一些程序:
1、很好理解,a = 2,b=a, b自然就等于2
2、a = 3,输出3,2也很好理解
3、按照序号1和序号2来理解输出为[2],[2]也没什么问题
4、序号4输出的是[3],[3]按照序号1和序号2来理解这里应该输出的是[3],[2]才对?
5、如果按照序号4来理解,这里的输出应该是[4],[4],为啥又变成了[4],[3]呢?
出现上面结果的原因涉及到了Python中的不可变数据类型和可变数据类型
不可变数据类型:整型int、浮点型float、字符串型string和元组tuple
可变数据类型:列表list和字典dict
两者的本质是取决于内存中的数据是否被修改
因为a是不可变数据类型,在赋新值的时候重新分配空间,储存数值后把新的内存地址给变量a,原本的数值2并没有被改变,所以b变量里保存的地址里面的数值2没有改变。
这就就可以解释序号2的输出为什么是3,2
因为a是列表所以是可变数据类型,所以a的地址并没有变。a[0]修改的只是列表里面保存的不可变数据类型。
这就可以解释序号3的输出,因为a和b保存的是列表地址47349576,此列表的内容变了,a,b都会的输出都会发生变化。
a = [4]意味着a保存的列表首地址被列表[4]的首地址覆盖,而b还是保存的原来列表的首地址即47349576,所以序号5的输出不是[4],[4]。
注意:
a = [3]和b=[3]的列表地址不同,相同的只有不可变数据类型3的地址