当前位置: 首页 > news >正文

学做面包到什么网站腾讯广告投放推广平台价格

学做面包到什么网站,腾讯广告投放推广平台价格,申请品牌注册商标流程,南宁市有哪些做网站的外包企业文章目录 版本前言形参和实参值传递和引用传递Python 变量存储值语义和引用语义值语义引用语义 探讨 Python 值传递和引用传递不可变(immutable)类型可变(mutable)类型案例一案例二 拓展:不可变类型真的不可变&#xf…

文章目录

  • 版本
  • 前言
  • 形参和实参
  • 值传递和引用传递
  • Python 变量存储
    • 值语义和引用语义
      • 值语义
      • 引用语义
  • 探讨 Python 值传递和引用传递
    • 不可变(immutable)类型
    • 可变(mutable)类型
      • 案例一
      • 案例二
  • 拓展:不可变类型真的不可变?
  • 总结
  • 个人简介

版本

  • Python 3.9

前言

  • 在编程语言中,值传递(pass by value)和引用传递(pass by reference)是两个重要的概念。它们涉及到变量在函数调用中的传递方式,对于理解函数调用和参数传递的机制至关重要。在本文中,我们将深入探讨 Python 中的值传递和引用传递,并通过代码示例进行说明。

形参和实参

  • 我们先了解一点前置知识,形参和实参,先说概念:形参出现在函数定义中,在整个函数体内都可使用,离开函数体则不可使用。实参出现在主调函数中,进入被调函数后,不能使用。
def func(param):# 这里 param 为形参print(param)if __name__ == "__main__":# 这里的 a 就是实参a = 1func(a)

值传递和引用传递

  • 我们先了解一下值传递和引用传递的概念:值传递是指在调用方式时,将实参的值拷贝一份给形参,对形参的修改不影响实参。引用传递也叫地址传递,指在调用方法时将实参的地址传递给形参,对形参的修改将影响实参的值,即传递的是实参的内存地址。

Python 变量存储

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

Python 变量存储

  • 代码实测:
a = 1
print(f"变量a的地址:{id(a)}")b = 1
print(f"变量b的地址:{id(b)}")b = 2
print(f"变量b的地址:{id(b)}")
  • 上面实例输出如下:
变量a的地址:2483649669424
变量b的地址:2483649669424
变量b的地址:2483649669456
  • 从实际用例我们可以看出,a、b = 1 时,这里底层为了性能考虑指向相同的内存,当 b 发生改变时,发生写时复制,b 指向了新的内存地址。

值语义和引用语义

值语义

  • 值语义是指将变量赋值为另一个变量时,会复制变量的值,而不是引用原始值所在的内存地址。如 Java 的基本数据类型。

引用语义

  • 引用语义是指将变量赋值为另一个变量时,实际上是将变量指向同一个对象的内存地址,而不是复制对象的值。如 Java 的引用数据类型、Python 值存储。

探讨 Python 值传递和引用传递

  • 了解完上面的一些基本概念后,我们从可变(mutable)和不可变(immutable)两种类型来探讨 Python 值传递和引用传递:

不可变(immutable)类型

  • 不可变变量的值一旦创建,就不能被修改。如果你尝试修改一个不可变对象的值,Python 将会创建一个新的对象。Python 中的不可变对象包括整数(int)、浮点数(float)、字符串(str)、元组(tuple)等。
  • 先简单看一个下面的例子:
def modify_value(x):print(f"变量x修改前地址:{id(x)}")x = x + 10print(f"变量x修改后地址:{id(x)}")print("函数内部修改后的值为:", x)# 调用函数
value = 5
print(f"变量value地址:{id(value)}")
modify_value(value)
print("函数外部原始值为:", value)
  • 在这个示例中,我们定义了一个函数 modify_value,它接受一个参数 x。在函数内部,我们对 x 的值进行修改,并打印出修改后的值。然后我们调用函数,传递了一个值为 5 的参数 value。运行以上代码,将会输出:
变量value地址:1886976960944
变量x修改前地址:1886976960944
变量x修改后地址:1886976961264
函数内部修改后的值为: 15
函数外部原始值为: 5
  • 可以看到,尽管在函数内部修改了形式参数 x 的值,但并没有影响到函数外部实际参数 value 的值,而发生了写时复制。

可变(mutable)类型

  • 可变变量的值可以在原地修改,而不会创建一个新的对象。Python 中的可变对象包括列表(list)、字典(dict)、集合(set)等。
  • 我们以 list 类型为例:

案例一

def modify_list(list):print(f"变量list地址:{id(list)}")list[2] = 4print(f"变量list修改地址:{id(list)}")print("函数内部修改后的列表为:", list)# 调用函数
my_list = [1, 2, 3]
print(f"变量my_list地址:{id(my_list)}")
modify_list(my_list)
print("函数外部原始列表为:", my_list)
  • 输出如下:
变量my_list地址:2115249727936
变量list地址:2115249727936
变量list修改地址:2115249727936
函数内部修改后的列表为: [1, 2, 4]
函数外部原始列表为: [1, 2, 4]

案例二

def modify_list(list):print(f"变量list地址:{id(list)}")list = [6, 6, 6]print(f"变量list修改地址:{id(list)}")print("函数内部修改后的列表为:", list)# 调用函数
my_list = [1, 2, 3]
print(f"变量my_list地址:{id(my_list)}")
modify_list(my_list)
print("函数外部原始列表为:", my_list)
  • 输出如下:
变量my_list地址:2141908331136
变量list地址:2141908331136
变量list修改地址:2141908181248
函数内部修改后的列表为: [6, 6, 6]
函数外部原始列表为: [1, 2, 3]
  • 看完上面的两个案例你是否有些许疑惑,案例一修改了函数外的原始值,案例二未修改函数外的原始值,下面我们用图解来解释一下上面发生了什么:

案例一
在这里插入图片描述

  • 从图解中我们可以清晰的看到,在案例一和案例二中函数传递了 my_list 地址的拷贝值,案例一中持有数组的内存地址,因此成功修改了原数组元素,案例二中 list 的内存地址修改为新的数组内存地址,并没有修改原数组的值。
  • 通过对可变(mutable)和不可变(immutable)两种类型的函数传递的分析,我们可以知道由于 Python 中一切皆对象的特性,实际传递给函数的都是内存地址的拷贝,从表现上来说,我们可以说 Python 中都是值传递,了解过 Java 的同学会发现这里和 Java 的引用类型原理一致。

拓展:不可变类型真的不可变?

  • 上面我们提到了可变类型和不可变类型,不可变类型真的是不可变的?我们来看下面的案例:
arr = (1, 2, [4, 4])print(f"元组修改前:{arr}")
arr[2][0] = 2
print(f"元组修改后:{arr}")
  • 输出结果:
元组修改前:(1, 2, [4, 4])
元组修改后:(1, 2, [2, 4])
  • 上面的案例中不可变类型出现了变化,这个是 bug ? 其实并不是,不可变类型的不可变指的是组成的元素是不可变的,在上面的案例 arr 元组中存储的是对应的内存地址,而不可变指的是内存地址和指向无法改变,但如果内存地址指向的是可变类型,比如数组,那么元素内部是可变的。

总结

  • 本文以值传递、引用传递的基本概念、以及 Python 变量存储为基础,从可变(mutable)和不可变(immutable)两种类型来分析 Python 值传递和引用传递的真相,通过充足的案例分析我们发现,Python变量 和 Java 引用类型类似,只存在值传递。

个人简介

👋 你好,我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technology has the power to make the world a better place.

🚀 我对技术的热情是我不断学习和分享的动力。我的博客是一个关于Java生态系统、后端开发和最新技术趋势的地方。

🧠 作为一个 Java 后端技术爱好者,我不仅热衷于探索语言的新特性和技术的深度,还热衷于分享我的见解和最佳实践。我相信知识的分享和社区合作可以帮助我们共同成长。

💡 在我的博客上,你将找到关于Java核心概念、JVM 底层技术、常用框架如Spring和Mybatis 、MySQL等数据库管理、RabbitMQ、Rocketmq等消息中间件、性能优化等内容的深入文章。我也将分享一些编程技巧和解决问题的方法,以帮助你更好地掌握Java编程。

🌐 我鼓励互动和建立社区,因此请留下你的问题、建议或主题请求,让我知道你感兴趣的内容。此外,我将分享最新的互联网和技术资讯,以确保你与技术世界的最新发展保持联系。我期待与你一起在技术之路上前进,一起探讨技术世界的无限可能性。

📖 保持关注我的博客,让我们共同追求技术卓越。

http://www.zhongyajixie.com/news/22289.html

相关文章:

  • 网站首页介绍新手如何找cps推广渠道
  • 平面艺术设计关键词seo排名优化软件
  • 平台网站建设设计个人发布信息免费推广平台
  • 如何找专业的网站建设公司如何做好互联网营销
  • 国外外贸网站大全四川百度推广和seo优化
  • 做网站学什么专业房管局备案查询网站
  • 网站域名使用期站长seo查询
  • 南昌网站改版公司seo资源网站 排名
  • 深圳网站建设大公司排名互联网营销师报考条件
  • 网站建设公司的职责网站开发制作培训学校
  • 瑞丽网站建设百度seo推广计划类型包含
  • 网站空间和数据库的关系品牌网络推广
  • 重庆政府采购网站官网市场策划方案
  • 做基因结构可以用哪个网站优化公司哪家好
  • 郑州平台类网站惠州seo关键词
  • 安徽党组织标准化建设网站国内十大4a广告公司
  • wordpress汇聚素材网网站搜索优化官网
  • 深圳公司建站推广网时代教育培训机构怎么样
  • wordpress没有css样式湖南seo优化按天付费
  • 做盗号网站2024年1月新冠高峰期
  • 网站运营服务商企业网络营销策划
  • 网络教育网站如何做营销推广万网域名官网
  • 做目录右内容网站手机百度经验首页登录官网
  • 做网站的费用如何写分录如何让网站快速收录
  • 信誉好的镇江网站优化2345手机浏览器
  • 成都什么是网站建设宁波seo整站优化软件
  • 调兵山网站建设白嫖永久服务器
  • 网站效果图确认表万网官网入口
  • 运城门户网站建设电商推广平台有哪些
  • 网站空间 程序有限制吗东莞疫情最新消息今天中高风险区