在理解浅拷贝和深拷贝之前,首先要理解学习一下变量在Python中是怎样存储的;

变量的类型是分值引用与地址引用两种.

python的一切变量都是对象,变量的存储,采用了地址引用的方式,存储的只是一个变量的值所在的内存地址,而不是这个变量的只本身。

在Python中,是有多种数据类型:bool、int、long、float、string、list、dict、tuple、set;

其中可分为基本数据类型和复杂数据结构;

基本数据类型:bool、int、long、float、string;

复杂数据结构:list、dict、tuple、set;(对于能存储基本数据类型的变量可以把它看做复杂数据结构)

由于Python中的变量存储都是地址引用,所以说复杂数据结构(list、dict、tuple、set)中存储的变量也仅仅是变量的地址。

一、变量的初始化(赋值):

1.Python中变量的初始化就是在内存中新开辟一块存储变量的值的内存,把这块内存的地址赋值给变量。(变量中存的是值的地址)

1 >>> str_1 = 'abc'

2 >>>id(str_1)3 4300773168

4 >>> str_2 =str_15 >>>id(str_2)6 4300773168

在给已经初始化的变量重新初始化的时候,就会重新更改变量中的地址。

1 >>> str_1 = 123

2 >>>id(str_2)3 4300773168

4 >>>id(str_1)5 4297541792

2.而在复杂数据结构中,更改数据结构中的元素(基本数据类型),仅仅是改变了这个元素的地址,而不会影响复杂数据结构本身的地址。

1 >>> list_1 =[1,2,3]2 >>>id(list_1)3 4320183368

4 >>> list_1.append(9)5 >>> list_1[2] = 22

6 >>> list_1.pop(2)7 3

8 >>> print(list_1,id(list_1))9 [1, 2, 22, 5, 6, 9] 4320183368

通过上边的事例做出结论:

当复杂数据结构(list、dict、tuple、set)赋值时,是在计算机中开辟一块内存来存储这个复杂数据结构的值,而修改其中元素的时候只是更改了复杂数据结构的元素的地址,不会影响复杂数据结构的地址(就像一个桌子上有坐着两个人,而桌子上的菜两个人是共同享有);当重新赋值时,会重新开辟新的内存来存储变量的值,把这块内存的地址存到变量中。(相当于桌子上的一个人移到了另一个桌子上吃)

二、拷贝:

在Python中,我们有时候要保存一份数据,再去对这块数据进行处理,而这个时候Python提供了两种拷贝方式:浅拷贝、深拷贝。

1.浅拷贝

浅拷贝: 不管是多么复杂的数据结构,浅拷贝只会拷贝第一层.

1 importcopy2 list_1 = [1,2,['a','b','c'],3]3 list_2 =list_1[:]4 #list_2 = copy.copy(list_1)浅拷贝的另一种方式

5 list_1[2][1] = 'kk'

6 print(list_1,list_2,id(list_1[2]),id(list_2[2]))7 [1, 2, ['a', 'kk', 'c'], 3] [1, 2, ['a', 'kk', 'c'], 3] 43305137364330513736

由于浅拷贝只会拷贝list_1的第一层,所以元素中的list的地址没有被更改,说明list_1和list_2共享同一个第二层的list。

2.深拷贝:

深拷贝会完全复制原变量的所有数据,在内存中生成一套完全一样的内容,我们对这两个变量中的一个进行任意修改都不会影响另一个变量。

1 importcopy2 list_1 = [1,2,['a','b','c'],3]3 list_2 =copy.deepcopy(list_1)4 list_1[2][1] = 'kk'

5 print(list_1,list_2,list_1[2],list_2[2])6 [1, 2, ['a', 'kk', 'c'], 3] [1, 2, ['a', 'b', 'c'], 3] 4330513736 4330512584

python如何复制一个变量_Python中变量、赋值、浅拷贝、深拷贝相关推荐

  1. Interview:算法岗位面试—10.11下午—上海某公司算法岗位(偏机器学习,互联网数字行业)技术面试考点之XGBoost的特点、python的可变不可变的数据类型、赋值浅拷贝深拷贝区别

    ML岗位面试:10.11下午-上海某公司算法岗位(偏机器学习,互联网数字行业)技术面试考点之XGBoost的特点.python的可变不可变的数据类型.赋值浅拷贝深拷贝区别 Interview:算法岗位 ...

  2. python怎么定义一个数字_Python数字变量定义赋值

    一.任务描述 本实验的任务主要对Python的变量赋值进行基本操作,通过完成本实验任务,要求学生熟练掌握Python的变量赋值与定义,并对Python变量的基本操作进行整理并填写工作任务报告. 二.任 ...

  3. python 双下划线变量_python 中变量的单下划线与双下划线的区别

    Python 用下划线作为变量前缀和后缀指定特殊变量. _xxx 不能用'from module import *' 导入 __xxx__ 系统定义名字 __xxx 类中的私有变量名 在 Python ...

  4. 一文搞懂JS中的赋值·浅拷贝·深拷贝

    前言 为什么写拷贝这篇文章?同事有一天提到了拷贝,他说赋值就是一种浅拷贝方式,另一个同事说赋值和浅拷贝并不相同.我也有些疑惑,于是我去MDN搜一下拷贝相关内容,发现并没有关于拷贝的实质概念,没有办法只 ...

  5. python中函数可以赋值给一个变量_python中函数赋值给变量时的问题注意详解

    变量赋值是我们在日常开发中经常会遇到的一个问题,下面这篇文章主要给大家介绍了关于python中将函数赋值给变量时需要注意的一些问题,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的 ...

  6. Python批量复制一个文件夹中的全部excel数据并粘贴至一个excel文件中-openpyxl模块

    最近工作经常要把多张相同表头,不同内容的数据汇总到一张excel中,为节省复制粘贴时间,我找到了Python中的openpyxl模块进行处理,读取一个文件夹下所有的excel文件并写入一张excel中 ...

  7. python怎么输出一个数组_python中实现将多个print输出合成一个数组

    比如有下面一段代码: for i in range(10): print ("%s" % (f_list[i].name)) 该代码段的执行,会生成如下的10行"name ...

  8. python实现输入一个正整数_Python中实现输入一个整数的案例

    我就废话不多说了,大家还是直接看代码吧! #! usr/bin/python3.5 # -*- coding:utf-8 -*- a = input("请输入一个整数:") #py ...

  9. python怎样定义一个数组_python中数组创建

    python中数组.列表.字典是最为常见的.最近在学习有关数组的语句,就把自己的学习的一些内容写下来. 首先就是创建数组. 方法1:创建数组的方法很简单直接,就是在shell界面写出来想要创建的数组 ...

最新文章

  1. 机器人也来玩“踢瓶盖挑战”了,你动他就动,靠脑电控制,路人也能玩丨MIT出品...
  2. 你会么?图形不正,角度是随机的
  3. Linux下的FTP命令害死人
  4. bzoj 1369: Gem 树形dp
  5. 不经意传输(oblivious transfer)
  6. 怎么查jupyter lab 内核_抗氧化精华推荐 CHA:LAB诗蕾泊帮你告别“零点肌”|抗氧化|精华-综合资讯...
  7. linux 提示库文件,Linux系统下确实库文件的解决办法
  8. Kotlin学习笔记23 协程part3 lambda表达式深入 挂起函数 全局协程
  9. Youki的C++命名规则
  10. 索尼音乐牵手UNLEASH厂牌 实力新星LiCong李聪 Veegee正式加盟
  11. win7工作组无法查看计算机名,win7系统无法查看工作组计算机怎么解决
  12. AutoCAD2000 DWG 格式 section location部分(简述)
  13. 账号跟帐号、账户跟帐户的区别
  14. Largest Contentful Paint (LCP)
  15. 树莓派官网VNC配置
  16. 记lrd的高二上学期第五次调研考试
  17. Linux运维人员成长之路必学书籍资料推荐
  18. 2022电工杯A题B题高质量保奖代码思路合集
  19. 【知识碎片】Net项目经验积累
  20. 哒哒哒哒哒哒,哒哒哒哒哒哒哒哒

热门文章

  1. Linux系统中df与du命令查看分区大小
  2. PMM (Percona MySQL Monitor) 部署
  3. C++四种强制类型转换 dynamic_cast,const_cast,static_cast,reinterpret_cast
  4. 近二十年大数据行业怎么样?解决了什么?经历了什么?
  5. 对于多表查询和转账的事务提交
  6. leetcode 355. Design Twitter | 355. 设计推特(Java)
  7. 递归算法题解析:设m,n均为自然数,m可表示为一些不超过n的自然数之和,f(m,n)为这种表示方式的数目
  8. 【MySQL】查看 mysql 数据库最后修改时间、创建时间、表大小
  9. 【PAT甲级】1048 Find Coins (25 分) C++ 全部AC
  10. 小师妹学JVM之:Dirty cards和PLAB