列表的浅复制|学习笔记

简介: 快速学习列表的浅复制

开发者学堂课程【Python 入门 2020年版列表的浅复制】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/639/detail/10300


列表的浅复制

 

内容介绍

一、引例

二、列表的 copy 方法

三、补充

 

一、引例

定义一个列表x,使得x和y两者指向同一个内存空间,现在要使得y和x的内容完全一致,但仅改变x不能影响到y。

但此时执行y=x后,改变x[0]的值为1时,再打印y,会发现y的结果被影响。

因为等号表示内存地址的赋值,说明x和y两者指向同一块独立的内存空间。

代码

x = [100,200,300]

#×和y指向了同一个内存空间,会相互影响

y = × x[0] =1     #等号是内存地址的赋值

print(y)

输出结果:

[1,200,300]

 

二、列表的copy方法

使用列表的copy方法,可以直接将原来的列表进行复制,变成一个新的列表,这种复制方式是浅复制。

1.列表的浅复制

因而此时要使得y改变而不影响x,可以调用copy方法,复制一个和原有列表内容一样,但是指向不同的新列表。我们定义一个z使其赋值x的列表内容,再打印输出x,y,z的地址,可以发现x和y指向同一个内存地址。

代码

x = [100,200,300]

y = × x[0] =1

print(y)

#调用copy方法,可以复制一个列表

#这个新列表和原有的列表内容―样,但是指向不同的内存空间

z.copy()

print(’ 0x%X ,0x%X,0x%X’ % (id(x), id(y), id(z)))

l 输出结果

[1,200,300]

0x27122DA5288,0x27122DA5288,0x27122DA5408

由图可知,x和y两者数据相同且指向同一内存空间,但z是将a的数据复制一份再单独保留,同时指向另一空间

 image.png

我们不打印x,y和z的下标,删除print(’ 0x%X ,0x%X,0x%X’ % (id(x), id(y), id(z))),我们在更改x中的元素之前复制到z,再将x第一个元素变为1,分别打印输出y和z的结果,可以发现z的内容并没有发生改变,仍未[100,200,300],而y的结果变为[1,200,300]。

image.png

代码

x = [100,200,300]

#调用copy方法,可以复制一个列表

#这个新列表和原有的列表内容―样,但是指向不同的内存空间

z.copy()

y = x

x[0] =1

print(y)

print(z)

l 输出结果

[1,200,300]

[100,200,300]

 

三、补充

1. 浅拷贝和深拷贝之后进行详细讲解。

2.浅拷贝

python中有一个内置的copy模块,同时a = copy.copy (x)和x. Copy()的效果一样,可以调用列表的copy方法,也可以使用列表的copy模块传入。

#除了使用列表自带的copy方法以外,还可以使用copy模块实现拷贝

import copy //导入内置模块

a = copy.copy (x)  #效果等价于x. Copy(),都是一个浅拷贝

#深拷贝 今后再讲解

3. 切片其实就是一个浅拷贝

(1)示例1:

定义一个名为names的列表,若想有一个内容一样但修改不影响的列表,我们可以使用copy或切片:name2 =name1[::],

同时print(names1,names2)输出后的结果一样,因为切片语法中中括号[]含有两个冒号表示从头切到尾。

l 代码

names1 =[‘张三’,’李四’,’王五','杰克']

names2 =names1[::]

//表示将names1的值切片后赋给names2

print(names1,names2)

l 输出结果

[‘张三’,’李四’,’王五','杰克'] [‘张三’,’李四’,’王五','杰克']

(2)示例2:

但将names1的值切片后赋给names2,再把names1的第一个数值变为jerry,打印输出names2,发现names2的值并未发生变化,说明与浅拷贝一致,切片后的内容一样,但地址并不同。

l 代码

names1 =[‘张三’,’李四’,’王五','杰克']

names2 =names1[::]

//表示将names1的值切片后赋给names2

names1[0] =’jerry’

print(names2)

l 输出结果

[‘张三’,’李四’,’王五','杰克']

相关文章
=和copy 字典和列表所有 深拷贝 浅拷贝
=和copy 字典和列表所有 深拷贝 浅拷贝
|
2月前
|
C++
C++(十一)对象数组
本文介绍了C++中对象数组的使用方法及其注意事项。通过示例展示了如何定义和初始化对象数组,并解释了栈对象数组与堆对象数组在初始化时的区别。重点强调了构造器设计时应考虑无参构造器的重要性,以及在需要进一步初始化的情况下采用二段式初始化策略的应用场景。
|
4月前
|
存储 索引 Python
元组和列表的区别?
【7月更文挑战第13天】元组和列表的区别?
307 6
|
6月前
|
数据采集 数据挖掘 Python
numpy中的浅复制和深复制的详细用法(3)
numpy中的浅复制和深复制的详细用法(3)
numpy中的浅复制和深复制的详细用法(3)
|
Python
python之集合的创建与使用,遍历,集合常见的操作函数,集合与列表,元组,字典的嵌套
python之集合的创建与使用,遍历,集合常见的操作函数,集合与列表,元组,字典的嵌套
Python函数每日一讲 - frozenset集合函数入门及实例
Python函数每日一讲 - frozenset集合函数入门及实例
|
存储 Python
Python字典和集合操作指南:创建、获取值、修改和删除键值对,复制和遍历方法全解析
Python字典和集合操作指南:创建、获取值、修改和删除键值对,复制和遍历方法全解析
785 0
1.1 集合与函数
1.1 集合与函数
81 0
|
索引 Python 容器
Python编程:容器总结-字符串、列表、元组、字典、集合
Python编程:容器总结-字符串、列表、元组、字典、集合
77 0
|
PHP 开发者
对象遍历|学习笔记
快速学习对象遍历
对象遍历|学习笔记
下一篇
无影云桌面