我可以看到三个基本的Python概念,它们可以为这个问题提供一些启示:

1)首先,来自可变对象的赋值,如self.foo = arg1

就像复制指针(而不是所指向的值):self.foo和{}是相同的对象。这就是为什么接下来的路线

^{pr2}$

修饰arg1(即Person1)。因此变量是不同的“名称”或“标签”,它们可以指向唯一的对象(这里是person对象)。这解释了baz(Person1)将Person1.age和bar1.foo.age修改为27,因为Person1和{}只是相同person对象(Person1 is bar1.foo返回{},在Python中)的两个名称。在

第二个重要的概念是作业。在def teh(arg1):

arg1 = [3,2,1]

变量arg1是本地的,因此代码meh = [1,2,3]

teh(meh)

首先是arg1 = meh,这意味着arg1是列表meh的附加(本地)名称;但是做arg1 = [3, 2, 1]就像说“我改变主意了:arg1从现在起将成为一个新的列表的名称,[3,2,1]”。这里要记住的重要一点是,尽管赋值用“等号”表示,但它们是不对称的:它们给右边和右边的(可变)对象一个额外的名称,在左边给出(这就是为什么你不能做[3, 2, 1] = arg1,因为左边必须是一个或多个名称)。因此,arg1 = meh; arg1 = [3, 2, 1]不能改变meh。在

3)最后一点与问题标题有关:“通过值传递”和“通过引用传递”不是Python中相关的概念。相关的概念是“可变对象”和“不可变对象”。列表是可变的,而数字是可变的,这就解释了你所观察到的。另外,你的Person1和bar1对象是可变的(这就是为什么你可以改变人的年龄)。您可以在atext tutorial和avideo tutorial中找到有关这些概念的更多信息。维基百科也有一些(more technical) information。一个例子说明了可变和不变行为之间的区别:x = (4, 2)

y = x # This is equivalent to copying the value (4, 2), because tuples are immutable

y += (1, 2, 3) # This does not change x, because tuples are immutable; this does y = (4, 2) + (1, 2, 3)

x = [4, 2]

y = x # This is equivalent to copying a pointer to the [4, 2] list

y += [1, 2, 3] # This also changes x, because x and y are different names for the same (mutable) object

最后一行是与y = y + [1, 2, 3]等价的not,因为这只会将一个新的list对象放入变量y,而不是同时更改y和{}所引用的列表。在

上面的三个概念(变量是[可变对象的名称]、非对称赋值和可变/不变性)解释了Python的许多行为。在

python引用传递产生的问题_理解Python中传递值和引用时出现问题相关推荐

  1. 什么是python语言的动态类型机制_理解Python的Dynamic typing

    Python的Dynamic typing有些类似于C语言的指针,在C中,一个变量可以指向任何地址空间,在Python中,一个变量也可以指向任何type的数据对象.变量的指向可以在程序运行过程中变化, ...

  2. 你真的了解C#中的值和引用吗?(上)

    术语解释 在阅读本文之前,你需要了解以下这几个术语是不同的:值.引用.值类型.引用类型. C#中有三种值(value),分别是值类型实例的值.引用类型实例的值和引用. 值类型表达式的值是数据本身. 引 ...

  3. java引用传递_理解Java中的引用传递和值传递

    关于Java传参时是引用传递还是值传递,是一个讨论比较多的话题, 有说Java中只有值传递,也有些地方说引用传递和值传递都存在,本篇记录思考过程,不保证正确性, 感兴趣的同学一起讨论. 1.基本类型和 ...

  4. python中元组_理解python中的元组

    理解 python 中的元组 引言 在 Python 中元组是这样的: 元组是是这样一种数据结构:不变的或者不可改变的(简单来说不能重新赋值) .元素的有序序列.因为元组是 不变的,所以他的数值是不能 ...

  5. c++ 协程_理解Python协程(Coroutine)

    由于GIL的存在,导致Python多线程性能甚至比单线程更糟. GIL: 全局解释器锁(英语:Global Interpreter Lock,缩写GIL),是计算机程序设计语言解释器用于同步线程的一种 ...

  6. python中的类怎样理解_理解Python数据类:Dataclass fields 的概述(下)

    原标题 Understanding Python Dataclasses?-?Part 2 ,作者为 Shikhar Chauhan . 这是 Python 最新的 Dataclasses 系列的第二 ...

  7. python3 协程 写法_理解Python的协程(Coroutine)

    由于GIL的存在,导致Python多线程性能甚至比单线程更糟. GIL: 全局解释器锁(英语:Global Interpreter Lock,缩写GIL),是计算机程序设计语言解释器用于同步线程的一种 ...

  8. python语言下划线怎么打_初学Python语言者必须理解的下划线

    下划线(_)在Python语言中有特殊作用. 在大多数编程语言中,下划线是命名变量或者函数名称时的连字符,但是,在Python语言中,不仅如此.如果你是一名Python程序员,对于诸如 _ in ra ...

  9. python怎么理解函数的参数_理解Python中函数的参数

    定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解 ...

最新文章

  1. rsync配置与应用(转)
  2. tomcat-users.xml 配置(转的)
  3. Lucene第一篇【介绍Lucene、快速入门】
  4. Kth Largest Element in an Array
  5. 如何为云部署安全开源代码?
  6. 华为手表用鸿蒙了吗,华为鸿蒙都2.0了,手机还不能用吗?
  7. hdu-6165(tarjan+topusort)
  8. lua——赢三张牌型处理相关算法(中)——牌型判定
  9. iOS 网络/本地 图片 按自定义比例缩放 不失真 方法
  10. python通过win32com库播放mp3文件的代码
  11. 强烈呼吁弃用Notepad++,推荐几款优秀替代品
  12. 姿态估计1-04:FSA-Net(头部姿态估算)-白话给你讲论文-翻译无死角(2)
  13. 看完这篇,你一定会打开谷歌搜索...
  14. Android如何配置init.rc中的开机启动进程(service)【转】
  15. 退出华为的时候,我在想些什么
  16. 高位字节与低位字节简单介绍
  17. 揭开自动驾驶在机场场景的商业化现状、挑战及趋势
  18. 人人都看得懂的C语言进阶系列之数据存储
  19. nrf52832 学习笔记(七)蓝牙协议层级理解
  20. PLC课程设计【博途】

热门文章

  1. Network下方什么请求也没有_HTTP的响应与请求
  2. 学计算机的事物多线程看不懂,看不懂CPU?学会看CPU只需明白这5点,如此简单!...
  3. 牛客小白月赛16 小石的签到题(博弈)
  4. Excel 工作表,单元格破解密码宏
  5. 4号团队-团队任务5:项目总结会
  6. [Luogu1891]疯狂LCM[辗转相减法]
  7. vscode快捷替换json格式
  8. 谈谈如何使用Netty开发实现高性能的RPC服务器
  9. 使用eclipse快速set/get
  10. Node_初步了解(4)小爬虫