Day034|如何理解可变数据类型与不可变数据类型

2021-03-29  本文已影响0人  龙渊的宝藏

今天是Andy学Python的第34 天哦! 

大家好,我是Andy。

01.

列表与字典属可变数据类型

首先观察上面这张图片。

定义一个变量a,并将列表 ['aaa', 'bbb', 'ccc', 'ddd']赋值给a。

定义一个变量b,将变量a赋值给b。

通过输出列表a、列表b及其ID,可以发现两个列表值与ID是一样的。

接下来,列表a插入第3个值“kkk”,列表b在最后插入“zzz”。

输出结果显示,两个列表值与ID还是一样的。

但是这并不是我们想要的,我们希望列表a、b输出如下结果:

['aaa', 'bbb', 'ccc', 'kkk', 'ddd']

['aaa', 'bbb', 'ccc', 'ddd', 'zzz']

WHY?

再来看下面这张图片。

定义一个变量a,并将字典{"a":1, "b":2, "c":3, "d":4}赋值给a。

定义一个变量b,将变量a赋值给b。

通过输出字典a、字典b及其ID,我们发现两个字典值与ID其实是一样的。

接下来,字典b更新键”d”值为100。

输出结果显示,字典a、字典b及其ID,两个字典值与ID还是一样的。

但是这并不是我们想要的,我们希望字典a、b输出如下结果:

{'a': 1, 'b': 2, 'c': 3, 'd': 4}

{'a': 1, 'b': 2, 'c': 3, 'd': 100}

WHY? 

书上解释:

变量不直接保存列表值,它们保存对列表的“引用”。在复制变量或将列表作为函数调用的参数时,这一点很重要。因为被复制的只是列表引用,所以要注意,对该列表的所有改动都可能影响到程序中的其他变量。如果需要对一个变量中的列表修改,同时不修改原来的列表,就可以用copy()和deepcopy()。

——出自《Python编程快速上手——让繁琐工作自动化》P78

个人理解:

列表与字典都属于可变数据类型,或称数据结构、数据容器。将列表或字典赋值给变量,是将其地址引用给变量。变量就像一个盒子,里面装的是该列表或字典的引用地址。而作为可变数据结构,列表或字典的地址保存的是容器的地址,至于容器里的东西多一件少一件,无所谓,只要容器还在,地址就没变。所有“引用”该可变数据容器的地址的操作,都会影响数据容器里的东西,但不会改变容器的地址(不能将变量直接删除,仅针对列表、字典的方法)。

不知道我这样讲,你是否明白。不明白的话,可以私信。

02.

数值、字符串、元组属不可变数据类型

原文:

变量包含对列表值的引用,而不是列表值本身。但对于字符串和整数值,变量就包含了字符串或整数值。在变量必须保存可变数据类型的值时,例如列表或字典,Python就使用引用。对于不可变的数据类型的值,例如字符串、整型或元组,Python 变量就保存值本身。

——出自《Python编程快速上手——让繁琐工作自动化》P76

个人理解:

这个解释我不认可。我觉得变量对字符串、数值或元组也是引用。只不过字符串、数值或元组作为不可变的数据类型,重新赋值、操作,会生成新的“值”并将其新的地址引用或映射给变量。如果原变量无重新赋值或其他操作,其“值”不变,ID也不变。

验证如下:

将元组(1,2,3,4,5)同时赋值给变量a、b、c。

分别对变量a、b进行操作,变量c不作改动,输出三个变量的值及其ID进行验证。

说明我的解释是说得通的!

51Day Day up!

向上向善,日进一步!

每天学习,努力成长!

定个小目标,开启成长的旅程,遇见更好的自己。

这是我们和自己的约定,许诺自己不负韶华。

路虽远,行则将至;事虽难,做则必成。

成长的最好时机,就是当下。

上一篇 下一篇

猜你喜欢

热点阅读