Python-函数传参与数据类型

news2024/11/15 17:15:38

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 = val


def modify_my_item(my_item):
    my_item._data = 4
    print("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.coloradmin.cn/o/1234689.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CyNix

CyNix 一、主机发现和端口扫描 主机发现,靶机地址192.168.80.146 arp-scan -l端口扫描,只开放了80和6688端口 nmap -A -p- -sV 192.168.80.146二、信息收集 访问80端口 路径扫描 gobuster dir -u http://192.168.80.146/ -w /usr/share/wordlists/dir…

吴恩达《机器学习》9-4-9-6:实现注意:展开参数、梯度检验、随机初始化

一、实现注意:展开参数 在上一个视频中,讨论了使用反向传播算法计算代价函数的导数。在本视频中,将简要介绍一个实现细节,即如何将参数从矩阵展开为向量。这样做是为了在高级最优化步骤中更方便地使用这些参数。 二、梯度检验 在神经网络中…

如何制作动态表情包?一个方法快学起来

在当代的通讯工具中,动态表情包已经是人们日常交流不可缺少的一部分了。但是,很多时候网络上常见的动态表情包不能够很好表达出我们的需求时应该怎么办呢?这时候,我们可以使用gif动图制作(https://www.gif.cn/&#xf…

深入理解强化学习——马尔可夫决策过程:马尔可夫决策过程和马尔可夫过程/马尔可夫奖励过程的区别

分类目录:《深入理解强化学习》总目录 《深入理解强化学习——马尔可夫决策过程》系列前面的文章讨论到的马尔可夫过程和马尔可夫奖励过程都是自发改变的随机过程,而如果有一个外界的“刺激”来共同改变这个随机过程,就有了马尔可夫决策过程&…

板块概念相关(五)

5-板块概念相关 文章目录 5-板块概念相关一. 查询所有的版块列表二. 查询所有的概念列表三. 查询所有的地域列表四. 查询所有的版块资金支持的类型五. 查询某个版块历史记录列表,形成图表形式六. 查询某个版块历史记录列表七. 查询某个版块今日资金,形成图表形式八. 查询该板块…

接入keycloak实现单点登录

问题 1.如果跨域在keycloak管理中心Clients-Client details-Settings-Web origins添加浏览器访问地址就行 一、html引入cdn实现 页面引入 <!-- keycloak --> <script src"https://unpkg.com/keycloak-js22.0.5/dist/keycloak.js"></script> &l…

学习Rust适合写什么练手项目?【云驻共创】

Rust是一门备受关注的系统级编程语言&#xff0c;因其出色的内存安全性、高性能和并发性能而备受赞誉。对于那些希望学习和掌握Rust编程语言的人来说&#xff0c;练手项目是一个不可或缺的环节。通过实际动手完成项目&#xff0c;你可以加深对Rust语言特性和最佳实践的理解&…

ky10 server arm 在线编译安装openssl3.1.4

在线编译脚本 #!/bin/shOPENSSLVER3.1.4OPENSSL_Vopenssl versionecho "当前OpenSSL 版本 ${OPENSSL_V}" #------------------------------------------------ #wget https://www.openssl.org/source/openssl-3.1.4.tar.gzecho "安装OpenSSL${OPENSSLVER}...&q…

郎酒“掉队”,经销商们能等来春天吗?

文 | 螳螂观察&#xff08;TanglangFin&#xff09; 作者 | 渡过 有“六朵金花”之称的川酒品牌中&#xff0c;五粮液、泸州老窖、舍得、水井坊都已成功上市&#xff0c;只剩下郎酒和剑南春未上市。 与IPO的“掉队”相对应的&#xff0c;是郎酒在冲刺高端、内部管理、渠道管…

C语言进制转换(1112:进制转换(函数专题))

题目描述 输入一个十进制整数n&#xff0c;输出对应的二进制整数。常用的转换方法为“除2取余&#xff0c;倒序排列”。将一个十进制数除以2&#xff0c;得到余数和商&#xff0c;将得到的商再除以2&#xff0c;依次类推&#xff0c;直到商等于0为止&#xff0c;倒取除得的余数…

Python之staticmethod:让你的代码更简洁高效

概要 在Python中&#xff0c;staticmethod是一种非常有用的装饰器&#xff0c;它可以将一个方法转换为静态方法&#xff0c;使得该方法可以通过类名或实例名直接调用&#xff0c;而不需要传入self参数。staticmethod的使用可以让代码更加简洁、高效&#xff0c;同时也可以提高…

Fiddler抓包看这篇就够了:fiddler设置弱网测试

弱网测试 概念&#xff1a;弱网看字面意思就是网络比较弱&#xff0c;我们通称为信号差&#xff0c;网速慢。 意义&#xff1a;模拟在地铁、隧道、电梯和车库等场景下使用APP &#xff0c;网络会出现延时、中断和超时等情况。 自动化测试相关教程推荐&#xff1a; 2023最新自…

DeepMind 推出 OPRO 技术,可用于优化 ChatGPT 提示

本心、输入输出、结果 文章目录 DeepMind 推出 OPRO 技术&#xff0c;可用于优化 ChatGPT 提示前言消息摘要OPRO的工作原理DeepMind的研究相关链接花有重开日&#xff0c;人无再少年实践是检验真理的唯一标准 DeepMind 推出 OPRO 技术&#xff0c;可用于优化 ChatGPT 提示 编辑…

vue-quill-editor 使用

vue-quill-editor 安装 npm install vue-quill-editor -S 使用 .....<quill-editorstyle"padding-left: 0;padding-top: .0px;margin-top: 30px;"ref"editorRef" v-model"params.content" class"ql-editor" :options"editor…

PG数据中DBeaver上传csv文件作为数据表

DBeaver 是一个开源的数据库工具&#xff0c;还是蛮好用的&#xff0c;有时候需要我们上传数据做表&#xff0c;数据为CSV格式的&#xff0c;DBeaver本身自带有功能实现的。 可打开连着的数据库&#xff0c;找到模式&#xff0c;点到下面的表里&#xff0c;选择一个表直接导入…

【Java】乡镇卫生院、社区卫生服务中心云HIS源码

云HIS采用云端SaaS服务的方式提供&#xff0c;用户通过浏览器即能访问&#xff0c;无需关注系统的部署、维护、升级等问题&#xff0c;系统充分考虑了模板化、配置化、智能化、扩展化等设计方法&#xff0c;覆盖了基层医院机构的主要工作流程&#xff0c;能够与监管系统有序对接…

Golang基础-面向对象篇

文章目录 struct结构体类的表示与封装类的继承多态的基本要素与实现interface空接口反射变量的内置pairreflect包解析Struct TagStruct Tag在json中的应用 struct结构体 在Go语言中&#xff0c;可以使用type 关键字来创建自定义类型&#xff0c;这对于提高代码的可读性和可维护…

安防监控视频云存储平台EasyCVR页面播放卡顿的优化方法

视频监控平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多路视频流&#xff0c;也能支持视…

Milvus 2.3.功能全面升级,核心组件再升级,超低延迟、高准确度、MMap一触开启数据处理量翻倍、支持GPU使用!

Milvus 2.3.功能全面升级&#xff0c;核心组件再升级&#xff0c;超低延迟、高准确度、MMap一触开启数据处理量翻倍、支持GPU使用&#xff01; 1.Milvus 2.3版本全部升级简介 Milvus 2.3.0 不仅包含大量的社区呼声很高的新功能&#xff0c;还带来了诸如 GPU 支持、Query 架构…