Python-函数传参与数据类型

Python中,函数参数传递是通过对象的引用进行的,我们可以进行下面的验证。

def use_name(val):print("name id :%s" % (id(val)))val = "hanshu1"print("name id modified :%s" % (id(val)))def test_ref():name = "hanshu" print("name id :%s" % (id(name)))use_name(name)test_ref()

执行上面的代码,结果如下:

通过Python内置的id函数,用于获取对象的唯一id,它是对象的内存地址,会在创建时分配给对象。

因此,在use_name函数内和函数外,我们都得到了同样的id,说明函数在传递参数时,传递的是对象的引用。当我们给val重新赋值时,它的id也发生了变化,说明这个值是在内存上重新分配的。

函数传参既然是通过对象的引用进行,那么在函数内对对象进行修改,势必会影响到函数外。

那么哪些情况会影响到函数外,哪些不会呢?

Python的数据类型列表如下:

  • 数值型:包括整数(int)、浮点数(float)、复数(complex)等;

  • 字符串型:字符串,文本信息;

  • list(列表):用于存储一系列数据,可以是不同类型的数据;

  • set:存储一系列唯一的数据,不支持索引和切片操作;

  • tuple(元组):类似于列表,用来存储一系列数据,但是元组不可变,即不能修改元组中的元素;

  • dict(字典):以键值对的形式存储数据,用来表示映射关系;

  • bool(布尔值):表示真或假,取值为:True和False;

  • 自定义数据类型

这些数据类型创建的值分为不可变对象和可变对象。

 

顾名思义,对于不可变对象,在函数中,只能通过重新赋值来对其进行“修改”(这里实际上是重新创建);可变对象,在函数中,可以通过修改其暴露的数据成员来进行修改。

因此,在下面的代码中,当我们在函数内部修改dt参数时,函数外部也受到了影响。

def modify_dict(dt):dt["name"] = "item2"print("modify_dict:{}".format(dt))def test_dict():dt = { "name": "item1"}modify_dict(dt)print("dt:{}".format(dt))test_dict()

运行结果如下:

也就是说,如果是可变对象,在函数内部对其进行修改,会影响到函数外部。这里的修改,其实就是指通过对成员变量进行赋值或者调用其成员函数的方式改变对象的成员数据。

那么我们自定义的类型是可变对象还是不可变对象呢?

先看看下面的代码:

class MyItem:def __init__(self, val):self._data = valdef modify_my_item(my_item):my_item._data = 4print("my_item id:{}".format(id(my_item)))def test_my_item():my_item = MyItem(3)print("my_item._data = {}".format(my_item._data))print("my_item id:{}".format(id(my_item)))modify_my_item(my_item)print("my_item id:{}".format(id(my_item)))print("my_item._data = {}".format(my_item._data))

输出结果如下:

 

在函数内部修改了我们的自定义类型的字段,my_item的id一直没变,即对象本身没变,但是_data的值变了。

无赖Python中没有真正的私有成员变量,因此,我们的自定义类型也不可能做成不可变对象。因此,我们虽然在例子代码中,为了证明_data值发生了变化,而在modify_my_item被调用之后,再次去读取了_data的值,但是在实际项目中,我们应该尽量避免这么做。如果确实需要,那么要在传入对象的拷贝而非对象本身(这是比较昂贵的操作)。

代码我已经上传gitee

python_study: 用于学习Python语言和库功能特性

大家可以自己clone一个试试。使用命令运行:

git clone https://gitee.com/hanshu_alan/python_study.git
cd python_study/types_and_parameters
python main.py
cd python_study/param_as_ref
python main.py

代码在持续更新中,有问题欢迎留言交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/214359.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatisPlus总结

MyBatis-Plus时Mybatis的Best Partner MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 特性 无侵入损耗小强大的 CR…

城市生命线丨市政综合管廊监测系统的效果

市政综合管廊,又被称为城市生命线,是我们在地下建造的一个智慧而高效的空间。它把市政、电力、通讯、燃气、给排水等各种管线集于一体,解决了城市中反复开挖路面、架空线网密集、管线事故频发等问题,为城市运行提供了重要的基础设…

ELK企业级日志分析平台——kibana数据可视化

部署 新建虚拟机server5,部署kibana [rootelk5 ~]# rpm -ivh kibana-7.6.1-x86_64.rpm [rootelk5 ~]# cd /etc/kibana/[rootelk5 kibana]# vim kibana.ymlserver.host: "0.0.0.0"elasticsearch.hosts: ["http://192.168.56.11:9200"]i18n.local…

RK3399平台开发系列讲解(内核入门篇)ConfigFS 的核心数据结构

🚀返回专栏总目录 文章目录 一、关键数据结构二、config_item 的结构体三、属性和方法沉淀、分享、成长,让自己和他人都能有所收获!😄 📢虚拟文件系统 ConfigFS 是一个特殊的文件系统,旨在提供一种动态配置 Linux 内核和设备的机制。 一、关键数据结构 ConfigFS 的核…

Python武器库开发-前端篇之html概述(二十八)

前端篇之html概述(二十八) html概述 HTML5是构建Web内容的一种语言描述方式。HTML5是互联网的下一代标准,是构建以及呈现互联网内容的一种语言方式.被认为是互联网的核心技术之一。HTML产生于1990年,1997年HTML4成为互联网标准,…

蒸蛋器上平台销售UL1026检测报告标准

蒸蛋器是一种采用发热盘通电后,使盘内产生高温蒸汽来快速把禽蛋蒸熟的一种生活小家电。蒸蛋器最大的特点就是快速、简单,并充满乐趣。 深圳ISO 17025实验室办理蒸蛋器亚马逊美国站UL报告办理UL1026测试标准。 UL1026标准是关于蒸蛋器的安全性要求&…

沉头孔和埋头孔的区别

埋头空和沉头孔的区别在于螺栓孔上部扩孔:沉头孔是直筒结构;埋头孔是四十五度结构,比沉头孔较为平顺。 螺栓孔上部扩孔能容纳螺栓头部,使螺头部不高于周围表面。埋头空和沉头孔只是两种不同的叫法。 沉头孔是 PCB 上的圆柱形凹槽…

配电室智慧运维监控系统

配电室智能运维监控系统是一个综合性的管理系统,专门针对配电室的运维工作进行设计。依托电易云-智慧电力物联网,它融合了先进的监测技术、自动化技术、数据分析技术等,对配电室进行全方位、实时的智能化监控和管理,以提升配电室运…

北京劲松HPV诊疗中心专业分析:扁平疣有什么特征?

扁平疣是一种常见的皮肤疾病,具有传染性,其主要特征包括皮肤出现扁平的丘疹、轻微瘙痒、好发于青少年等。今日特邀北京劲松HPV诊疗中心主任谭巍将详细介绍扁平疣的特征,希望借此能提高大众认知水平,以更好预防。 年轻漂亮的小芳是…

opencv-ORB检测

ORB(Oriented FAST and Rotated BRIEF)是一种图像特征检测和描述算法,结合了 FAST 关键点检测器和 BRIEF 描述子的优点。ORB 算法具有良好的性能,特别适用于实时应用,如目标追踪、相机定位等。 以下是 ORB 算法的一般…

python+gurobi求解线性规划、整数规划、0-1规划

文章目录 简单回顾线性规划LP整数规划IP0-1规划 简单回顾 线性规划是数学规划中的一类最简单规划问题,常见的线性规划是一个有约束的,变量范围为有理数的线性规划。如: 使用matlab的linprog函数即可求解简单的线性规划问题,可以参…

全网最全图解Kafka适用场景

消息系统 消息系统被用于各种场景,如解耦数据生产者,缓存未处理的消息。Kafka 可作为传统的消息系统的替代者,与传统消息系统相比,kafka有更好的吞吐量、更好的可用性,这有利于处理大规模的消息。 根据经验&#xff…