前言
今天和师弟一起讨论问题,学到了很多,遂记录一下,也明白了一个人绝对不可能学完所有的知识,多和别人沟通是非常有效的学习方式!
问题起源:数组赋值
a=[1,2,3]
b=a
b[0]=5
print(a)
猜猜看 a 输出是多少?
a=[5,2,3]
再来看一个
a=1
b=a
b=5
print(a)
猜猜看 a 输出是多少?
a=1
为什么会出现这样的情况呢?同样是修改b,为什么列表的a变了,而int的a不变呢?
首先我们要明白在python中存在可变和不可变数据类型,可变数据类型有列表和字典,不可变数据类型有整型、字符、字符串、元组。可变和不可变的意思是什么,区别是什么呢?
a=[1,2,3]
b=[1,2,3]
c=1
d=1
print(id(a)==id(b))
print(id(c)==id(d))
运行这段代码会发现,第一个输出False,第二个输出True,这就可以看出区别了,对于整型变量而言,只要它们的值相同,那么无论有多少个变量指向这个值,这些变量的id都相同,但是对于列表而言,值相同,变量的id不一定相同。但是用“=”赋值,“=”两边的变量的地址是一样的,指向的内容也是一样的,所以你无论如何改变列表中的元素值,最终这两个变量的地址都指向同一个列表,这就解释了上面改变一个列表的元素,另一个列表为什么也变了。而对于整型数据,只要内容不一样,那么变量的地址一定不一样,所以你让b=5之后,b有新的地址,已经不指向1了,而a仍然指向1,所以改变b无法影响a。也就是说最关键的在于可变和不可变的理解,不可变数据类型指的是相同的值无论有多少个变量指向它,变量的id都是相同的(但是元组并不是这样,我也不知道为什么),而可变数据类型则是不同的变量指向相同的值,它们的id也不相同。
网友评论