当我们想复制两个一模一样的列表时,我们可能使用到list.copy()这个方法,这个方法可以让我们复制一个相同的数组,当遇到下面这种情况时,可能会遇到一些问题 1 2 3 4 5 # _*_coding=ut
当我们想复制两个一模一样的列表时,我们可能使用到list.copy()这个方法,这个方法可以让我们复制一个相同的数组,当遇到下面这种情况时,可能会遇到一些问题
此时打印出nameList和nameList1时,两个列表的元素是下面这样
可以看到列表的第二个元素不一样 这是因为在python中list.copy()这个函数在执行的时候,指向的不是nameList在内存中的地址,而是重新复制了一份,此时两个列表在内存中的地址不同,我们可以打印出来看看 使用如下代码可以见到,两个列表的内存已经有差别了
此时修改的nameList[1] = 55并不会在nameList1中生效 而当nameList中又存在数组时,情况又会发生变化
输入如下内容
可以看到两个list中嵌套的数组都发生了变化,这是因为在列表中存放的二维列表,实际上存放的是二维列表在内存中的地址,当修改其中一个列表,另外一个自然也会受到影响,那么,让我们来验证一下是不是存放的内存地址。 同样的,我们使用id()这个方法来取出内存地址
输出如下内容
可以看到,两个内存地址是相同的 copy方法介绍到此结束 补充:python list.copy() 和 copy.deepcopy()区别 举个例子
解释
python的list里面存的都是引用,如果存的是listnode,实际上存的是listnode的引用,也就是地址,毕竟如果listnode里存了很多关于这个node的信息的话,直接在list里面存这段信息的地址就很方便,等到要用这段信息的时候(比如list1[0].val),只要找到地址(list1[0])再到这段地址取值(.val)就可以了。 浅拷贝的意思是,开辟一段内存,这段内存里复制了原list的地址。 地址还是那个地址,所以可以看出**id(list1[0]),id(list2[0])**是完全一样的。这会带来的问题是,当我们把这段地址里的值.val变化一下(list1[0].val = 5), 浅拷贝的数组里对应元素的值也就跟着变了 深拷贝就厉害了,不光把原数组存的地址拷贝了,就连原数组地址里对应的数据也都进行了复制,所以可以看到**id(list1[0]),id(list4[0])**变得不一样了 |
2019-06-18
2019-07-04
2021-05-23
2021-05-27
2021-05-27