这个问题涉及到深拷贝和浅拷贝,同时也涉及到电脑中赋值操作的意义
先说赋值:一般的赋值是赋值地址的链接,内部的操作是这样的:
a=3: 计算机会在内存中创建一个数字3,这个数字3内存的地址赋值给a,也就是变量a是通过地址指向数字3的
b=a:这个赋值操作就是把a的地址赋值给b,也就是b的地址也指向了内存中的数字3
所以a、b两个变量指向的内存地址都是一样的,都是数字3
如果a=4,那a的地址就不再是指向3,而是4了
所以赋值操作,是地址的赋值,而不是内存数据的重新拷贝
这个也不是绝对的,所以总会有例外,这就是深拷贝,就是把内存中的数据重新拷贝一份,把新数据的地址赋值给变量
所以问题中的b=a[:],就是这样的情况,就是深拷贝,这也是在列表运用中的一个特性
如果你仅仅是赋值链接,通过b=a就可以,如果你想把内存数据重新拷贝一份,就是b=a[:]
你会有一个疑问,那就是既然都可以让b获得同样的数据,为什么还要这么繁琐用两种不同的方式?
这里会存在一个情况,b=a这样的赋值,会存在一个问题,就是如果你修改a内存的数据,b指向的数据就会跟着更新,
但是如果你只是想修改a,不想修改b,这个时候就是可以通过b=a[:]来实现,这个就是它存在的意义
所以明白了上面所说的计算机内部运作的逻辑,就很容易理解通过is判断,为什么两者是不一样的了
is判断的不是两者的内存数据内容,而是两者的内存地址是否一样
b=a[:],使得b有了新的内存数据地址,所以a、b两者虽然数字都是一样的,但是内存地址是不一样的,所以结果False
以上的解答说明,希望能帮你解惑,祝学习愉快