当我们在python中使用等号给数组赋值的时候往往会出现一个问题

a = [1, 2, 3]
b = a
print("a数组为:",a)
# a数组为: [1, 2, 3]
print("b数组为:",b)
# b数组为: [1, 2, 3]

正常我们这样使用是没有任何问题的,但是如果我们将原数组 a 进行改变pop出一个栈顶元素

a.pop()
# Out[6]: 3
print("b数组为:",b)
# b数组为: [1, 2]

我们发现 b 数组也改变了,可是我们明明改动的是 a 数组,这是为什么呢?
因为在 python 中 “=”传递的是地址而不是值,所以实际上 b=a 的操作只是将a的地址传给了b,所以改动了值,无论谁来读取都是一样的改变了。
如果我们想完全复制一个互不影响的数组应该怎么办呢?

a = [1, 2, 3]
b[:] = a
a.pop()
# Out[6]: 3
print("b数组为:",b)
# b数组为: [1, 2, 3]

我们使用 b[:] 的方式 就相当于把 a 数组的每一个元素对应的拷贝到 b 中去所以就另开了一块空间存储,这时的a ,b是互不影响的。

这里涉及到一个知识点就是python参数引用的问题(传值\传地址)
如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值——相当于传址。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,这时就不能直接修改原始对象的值,所以这时候相当于值传递。这也就可以解释为什么 [:]可以直接接收到值传递,因为没有[:]的时候传递的是一整个list的地址,加上了[:]表示的传递的是list中的不可变对象,因此变成了值传递。

所以python的传值和传址是根据传入参数的类型来选择的
传值的参数类型:number,str,tuple
传址的参数类型:list,dict

其实正常我们想要实现复制一个值相等的对象的时候,常用的办法是 copy 和 deepcopy

import copy
a=[1,2,3]
b=copy.copy(a)
a.pop()
print(a,b)
# [1, 2, 3, 4] [1, 2, 3]

我们可以看到使用copy的方法也是可以实现这种复制的,此时a与b值相同地址不同,修改一方不会互相影响,但是当我们复制的对象中存在复杂类型的时候,我们再来看一下

a=[[1,1],2,3]
b=copy.copy(a)
a[0].append(1)
print(a,b)
# [[1,1], 2, 3] [[1,1], 2, 3] 

夭寿了!我们发现又不好使了,面对这种复杂数据类型的时候就要轮到我们的deepcopy出场了

a=[[1,1],2,3]
b=copy.deepcopy(a)
a[0].append(1)
print(a,b)
# [[1,1,1], 2, 3] [[1,1], 2, 3] 

easy as a pie, mission complete!!

python参数传递相关推荐

  1. python参数传递方法_深入理解python中函数传递参数是值传递还是引用传递

    python 的 深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是&q ...

  2. 经典 Python参数传递采用的肯定是“传对象引用”的方式。相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象

    python不允许程序员选择采用传值还是传引用.Python参数传递采用的肯定是"传对象引用"的方式.这种方式相当于传值和传引用的一种综合.如果函数收到的是一个可变对象(比如字典或 ...

  3. python 参数传递

    python 参数传递 def test1(*args):test3(*args)def test2(**kargs):test3(**kargs)def test3(a, b):print(a,b) ...

  4. python参数传递,如何让可变参数当作不可变参数传递

    引子 众所周知,python中参数传递方式有很多,这些在其他文章中都有所详细陈述,在此不做赘述.(如果你需要了解python参数传递的基本知识,请绕路,相关文章在CSDN很丰富.)但是小编遇到一个问题 ...

  5. python参数传递:对象的引用

    python参数传递:对象的引用 大家都知道在python中,一切皆对象,变量也不再具有类型,变量仅仅是对象的一个引用,我们通常用变量来测类型,通常测得就是被这个变量引用得对象的类型. 例如: 这里的 ...

  6. Python参数传递:值传递和引用传递

    前提: 1.Python 中万物皆为对象,变量以引用的方式指向对象. 2.身份 2.1 可变对象:对象的内存值可以被改变,引用变量改变后,实际上是其所指向的值发生了变化,当前这块内存区域中存放的内容发 ...

  7. python参数传递_python中的*和**参数传递机制

    python的参数传递机制具有值传递(int.float等值数据类型)和引用传递(以字典.列表等非值对象数据类型为代表)两种基本机制以及方便的关键字传递特性(直接使用函数的形参名指定实参的传递目标,如 ...

  8. python参数传递时不构造新数据对象_关于函数的参数传递(parameter passing),以下选项中描述错误的是_学小易找答案...

    [单选题]下面代码的输出结果是: a = [] for i in range(2,10): count = 0 for x in range(2,i-1): if i % x == 0: count ...

  9. python参数传递_python参数的传递

    >[danger]# 值传递和引用传递 如果你接触过其他的编程语言,比如 C/C++,很容易想到,常见的参数传递有 2 种:值传递和引用传递. >[success]1. 值传递,通常就是拷 ...

  10. Unity/C#、Python 参数传递

    Unity的C#参数传递 在使用Unity命令行时候用到参数时候,需要将参数从外部传递,在C#中读取. 例如一个shell调用Unity的命令: # [unity path] -quit -proje ...

最新文章

  1. Linq 集合处理(Union)
  2. 客户端使用win共享文件出错解决方法
  3. C语言sprintf 和 sscanf函数
  4. 走进JVM之一 自己编译openjdk源码
  5. SVG PATH d参数的 ace
  6. Xtract 实现 VMware Vsphere 迁主机到 Nutanix cluster
  7. SET ARITHABORT ON 对UI的影响
  8. linux命令:ln
  9. 深圳数字人民币专项资金至3月末已累计发放1.96亿元
  10. Web接收实时视频流并显示(flask创建路由接收)| 解决延时不同步问题
  11. 技术实践如何支持演进式架构和持续集成
  12. IDEA 代码格式化插件Save Actions示范
  13. Python LeetCode 数组中的最长山脉
  14. Android蓝牙手柄开发
  15. 吃鸡神器!新款苹果 iPad,免费送一台!
  16. GNU Screen的使用方法
  17. 网址二维码:如何制作网页链接二维码?
  18. 没穿越的小伙伴,来领个随身老爷爷
  19. md5 java 实现_MD5加密的Java实现
  20. Git 处理tag和branch的命令

热门文章

  1. 生态模式下的林业栽培管理技术探析
  2. 耐强酸强碱的电连接器航空插头
  3. 乙肝五项怎么区分大三阳和小三阳
  4. java 图片的处理
  5. php大整数怎么保存,自上而下,逐步揭开PHP解析大整数的面纱
  6. 计算机 sci 会议,Call For Paper: ICPCSEE 2018(SCI or EI)
  7. php blog ---- 感谢一位朋友
  8. 猜数字游戏,输入一个 1-100 以内的数字
  9. 从草根到百万年薪程序员的十年风雨之路,细节爆炸
  10. C语言strlen函数的模拟实现