关于 Python 中列表的问题

预计阅读时间:5分钟

关于这篇文章,是我的 QQ 中一位好友中午时问我的问题。为了减少 「前戏时间」,说重点了。

代码如下:

运行结果如下:(红色手动标注)

问题如下:

为什么在第一次时就已经将c[][1] =100 运行效果显示出来,按照常理应该是第一次不替换,第二次才替换,为什么?

填坑如下:

一句话,当list类型的对象进行append操作时,实际上追加的是该对象的引用

解释如下:

第一次运行循环,即 i = 0 时,追加到 b 的列表相应位置还不为 100 ,当执行到c[][1] =100 语句时,上图中第一个红框就变为 100 了,原因为列表中 append() 函数为地址的引用,并不是复制,只是将 b.append(c) 语句中添加的内存位置指向引用了,并没有复制。

第二次循环时,i = 1 ,这是列表 b 在上一次循环结束时已经不为空,在其列表最后添加新的列表,这次还是向第一次一样,list 中的 append()为引用内存地址,所以还是为 100

举例说明浅拷贝 & 深拷贝:

浅拷贝

当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用。我们称之为浅拷贝。

浅拷贝产生的新对象中可变对象的值在发生改变时会对原对象的值产生副作用,因为这些值是同一个引用

在 python 中,标识一个对象唯一身份的是:对象的(内存地址),对象类型,对象值,而浅拷贝就是创建一个具有相同类型,相同值但不同的新对象。

对可变对象而言,对象的值一样可能包含有对其他对象的引用,浅拷贝产生的新对象,虽然具有完全不同的,但是其值若包含可变对象,这些对象和原始对象中的值包含同样的引用

可见浅拷贝产生的新对象中可变对象的值在发生改变时会对原对象的值产生副作用,因为这些值是同一个引用。

浅拷贝仅仅对对象自身创建了一份拷贝,而没有在进一步处理对象中包含的值。因此使用浅拷贝的典型使用场景是:对象自身发生改变的同时需要保持对象中的值完全相同,比如 list 排序。

深拷贝

深拷贝不仅拷贝原始对象自身,也对其包含的值进行拷贝,它会递归的查找对象中包含的其他对象的引用,来完成更深层次拷贝。因此,深拷贝产生的副本可以随意修改而不需要担心会引起原始值的改变。

深拷贝不仅仅拷贝了原始对象自身,也对其包含的值进行拷贝,它会递归的查找对象中包含的其他对象的引用,来完成更深层次拷贝。因此,深拷贝产生的副本可以随意修改而不需要担心会引起原始值的改变

就是这样一个问题引出的推文,考试期间还更的我,也是没谁了。

给自己加鸡腿!哈哈,考试必过

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20180621G01X7I00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券