Python 传值和传址 copy/deepcopy
传值:被调函数局部变量改变不会影响主调函数局部变量
传址:被调函数局部变量改变会影响主调函数局部变量
Python参数传递方式:传递对象引用(传值和传址的混合方式),如果是数字,字符串,元组则传值;如果是列表,字典则传址;
1. Python中的传址和传值
Python是不允许程序员选择采用传值还是传址的。Python参数传递采用传值和传址的一种综合。
如果函数收到的是一个可变对象(比如字典或者列表),就能修改对象的原始值(相当于传址)。如果函数收到的是一个不可变对象(比如数字、字符或者元组)(其实也是对象地址),就不能直接修改原始对象——相当于传值。
所以python的传值和传址是根据传入参数的类型来选择的
传值的参数类型:数字,字符串,元组(immutable)
传址的参数类型:列表,字典(mutable)
def f1(a):
a += 1
def f2(a):
a.append([2, 5]) a = 1
b = [1, 2]
f1(a)
f2(b)
print(a) #实际输出:1
print(b) #实际输出:[1, 2, [2, 5]]
因为a是数字类型,是传值的方式,a的值不变,输出为1。b的类型是列表,是传址的形式,b的值会改变,输出:[1, 2, [2, 5]]
2. copy和deepcopy
Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块。
(1). copy.copy 浅拷贝只拷贝父对象,不会拷贝对象内部的子对象(相当于只拷贝指向子对象的指针,不拷贝所指向的内容)。
(2). copy.deepcopy 深拷贝 拷贝对象及其子对象(拷贝子对象指针所指向的内容)
不止是函数里面,函数外面的引用也同样遵循这个规则:
a = 1
b = a
a = 2
print(a, b) #实际输出:2, 1
a = [1]
b = a
a[0] = 2
print(a, b) 实际输出:[2][2]
在python中,当运行上面的代码时,如果a是字典或者列表,b=a操作并不是新建一个b变量在把a赋值给b,而是新建一个b变量,把b的值指向a,相当于c语言里面新建一个指向a的指针。所以当a的值发生改变时,b的值会相应改变。
但是,当我们想新建一个与a的值相等的b变量,同时b的值与a的值没有关联时,要怎么做?这时就用到copy与deepcopy了
import copy
a = [1, 2, 3]
b = a
a.append(4)
print(a, b) #实际输出:[1, 2, 3, 4] [1, 2, 3, 4] a = [1, 2, 3]
b = copy.copy(a)
a.append(4)
print(a, b) #实际输出:[1, 2, 3, 4] [1, 2, 3]
这里用了copy来让b与a相等,后面如果修改了a的值,b的值并不会改变。看来copy已经可以实现我们上面的提到的需求了,那么deepcopy又有什么用?
如果我们遇到这种情况,copy就解决不了了
a = [1, [1, 2], 3]
b = copy.copy(a)
a[1].append(4)
print(a, b) #实际输出:[1, [1, 2, 4], 3] [1, [1, 2, 4], 3]
当列表或字典参数里面的值是列表或字典时,copy并不会复制参数里面的列表或字典,这时就要用到deepcopy了
a = [1, [1, 2], 3]
b = copy.deepcopy(a)
a[1].append(4)
print(a, b) #实际输出:[1, [1, 2, 4], 3] [1, [1, 2], 3]
Python 传值和传址 copy/deepcopy的更多相关文章
- Python的传值和传址与copy和deepcopy
1.传值和传址 传值就是传入一个参数的值,传址就是传入一个参数的地址,也就是内存的地址(相当于指针).他们的区别是如果函数里面对传入的参数重新赋值,函数外的全局变量是否相应改变,用传值传入的参数是不会 ...
- Java传值和传址
调用函数时,传的参数过去可能是传值,也可能是传址.如果是传值,函数内部的操作对参数的值没有影响:如果是传址,函数内部的操作是对参数指向的内存进行操作,会影响参数的值. Java到底是传值还是传址?用下 ...
- javascript的变量,传值和传址,参数之间关系
先把收获晾一下: 1.javascrip变量包含两种类型的值,一种为引用类型的值,一种是基本类型的值.引用类型包括:Array,Object,Function(可以这么理解,非基本类型的都是引用类型) ...
- 图解JS的传值与传址
//编程过程中经常会碰到传值,传址的问题!今天的主题就是关于传值.与传址. //先讲讲赋值操作 //下例是原始类型赋值操作 var a=1,b=a,a=2; console.log("a=& ...
- JAVA传值与传址
要了解JAVA中的传值与传址问题,必要先要了解JVA中的栈内存和堆内存,>>>>点些查看<<<<昨天写的学习记录 栈:基本数据类型.数据的引用变量,这两 ...
- javascript . 05 json的组成、for...in 遍历对象、简单数据类型与复杂数据类型的传值与传址、内置对象
对象字面量 JSON var obj = { aaa :999}; var json={"aaa":999,"bbb":888}; "kay&quo ...
- 工控随笔_18_西门子_WinCC的VBS脚本_07_变量作用域和传值、传址
在vbs脚本中也存在和其他编程语言一样的概念,那就是变量的作用域,变量的作用域决 定在什么范围内可以访问. 同样的在vbs脚本中对于变量也有一个生命周期, 变量的生命周期决定了变量的存续时间 这个主要 ...
- java方法中,传参是传值还是传址问题(对比C语言、C#和C++)
问题引出: 编写一个简单的交换值的小程序,如果我们只是简单地定义一个交换函数接收两个数,在函数内部定义一个中间变量完成交换.那么当我们把a,b两个实参传给这个函数时,往往得不到预期的结果.这是为什么呢 ...
- js- 引用和复制(传值和传址)
js- 引用和复制(传值和传址) 好像一般很少人讲到js中的引用和复制,不过弄清楚这个概念可以帮助理解很多东西 先讲一下很基础的东西,看看js中几种数据类型分别传的什么引用:对象.数组.函数复制:数字 ...
随机推荐
- Android 控件进阶修炼-仿360手机卫士波浪球进度控件
技术:Android+java 概述 像360卫士的波浪球进度的效果,一般最常用的方法就是 画线的方式,先绘sin线或贝塞尔曲线,然后从左到右绘制竖线,然后再裁剪圆区域. 今天我这用图片bitma ...
- android 发送短信的两种方式,以及接收报告和发送报告
android发送短信,以及接收报告和发送报告 android中发送短信其实有两种方式,这个和打电话类似,大家可以了解一下: 一.调起系统发短信功能 ...
- 修改谷歌云google cloud engine VM root账户的密码和允许远程ssh登录
Figured it out. The VM's in cloud engine don't come with a root password setup by default so you'l ...
- 使用Dockerfile文件构建基于centOS系统的nodejs镜像
实际示例: [root@node01 node]# ls dev-web dev-web.tar.gz Dockerfile node-v8.14.0-linux-x64.tar.gz package ...
- [转]GAN论文集
really-awesome-gan A list of papers and other resources on General Adversarial (Neural) Networks. Th ...
- activiti实战--第一章--认识Activiti
学习资料:<Activiti实战> 第一章 认识Activiti 内容概览:讲解activiti的特点.接口概览.架构等基本信息. 1.3 Activiti的特点 1.使用mybatis ...
- 创建 maven maven-archetype-quickstart 项目抱错问题解决方法
问题: eclipse装m2eclipse的时候装完后创建项目的时候报错: Unable to create project from archetype org.apache.maven.arche ...
- QQMacMgr for Mac(腾讯电脑管家)安装
1.软件简介 腾讯电脑管家是 macOS 系统上一款由腾讯公司带来到的安全管理软件.功能有垃圾清理.软件仓库.小火箭加速和防钓鱼等.而在视觉 UI 上,导入星空概念,操作过场动画全部以星空为题材 ...
- GitHub Desktop 代码库管理工具
1.GitHub Desktop 简介 GitHub Desktop 是用于 GitHub 项目版本控制软件. 官网下载地址 GitHub Desktop 其它下载地址 GitHub Desktop ...
- process credentials(一)
一.介绍 当linux系统中的一个进程运行起来的时候,总是要访问系统的资源,访问文件或者向其他的进程发送信号.系统是否允许其进行这些操作?系统是根据什么来判断该进程的权限?这些问题是和进程信任状(pr ...