今天是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!
向上向善,日进一步!
每天学习,努力成长!
定个小目标,开启成长的旅程,遇见更好的自己。
这是我们和自己的约定,许诺自己不负韶华。
路虽远,行则将至;事虽难,做则必成。
成长的最好时机,就是当下。
网友评论