python中值传递、引用传递、global关键字

news2024/11/22 21:29:20

结论1、函数中,数值、字符、元组的传递是值传递



b = 5
print('id b = ',id(b))

def change(b):
    print('\n')
    #print('在函数change中 修改前 id b = ',id(b))
    b = 0
    print('在函数change中 修改后 id b = ',id(b))


def print_b():
    print('\n')
    print('在函数print b中 b =', b)
    print('在函数print b中 id b = ',id(b))



def global_change():
    global b
    print('\n')
    print('在函数global change中 修改前 id b = ',id(b))
    b = 8
    print('在函数global change中 修改后 id b = ',id(b))


change(b)
print_b()
global_change()
print_b()

print('\n\n\n\n','='*20,'')

在这里插入图片描述

结果如上所示:
1、在chage函数中 id 明显发生了改变,修改的不是同一个内存。
2、在global change 中由于增加了global关键字,所以开始时b变量指向的是同一块内存。而后修改变量,重新开辟空间,全局变量b指向新开的空间
3、在最后的printb中可以看出,全局变量b已经被修改。

# 元组类型
print(' *'*10,'元组'," *"*10)
d = ()
print('初始化后 id d : ',id(d))
def add_item_turple(d):
    # 值传递
    print()
    print('函数中改变前 d: ',d)
    print('函数中改变前 id d: ',id(d))
    #global d
    d+=(5,)
    print('函数中改变后 d: ',d)
    print('函数中改变后 id d: ',id(d))
    print()
add_item_turple(d)
print('函数运行完后 d :',d)
print('函数运行完后 id d : ',id(d))

在这里插入图片描述

注:

b=8这句的执行过程并不是先获取x原来指向的对象的地址,再把内存中的值更改为8,而是新申请一段内存来存储对象8,再让x去指向对象8,所以两次id(x)的值不同。

结论2、函数中,数组、字典的传递是类似于引用的传递

a = [1,2,3,4,5,6]
print('原始 id a : ',id(a))


# 传参方式查看
def func_value_(a):
    #global a
    print('函数func_value_中 修改前id a : ',id(a))
    a.append(666)

    print('函数func_value_中 修改后id a : ',id(a))


def app_end():
    #global a
    print('函数append中 修改前id a : ',id(a))
    a.append(666)

    print('函数append中 修改后id a : ',id(a))

def print_a():
    print(a)
    print('函数printa中 id a : ',id(a))

print_a()
app_end()
print_a()
func_value_(a)
print_a()

print('\n\n\n\n','='*20,'')

在这里插入图片描述

可以看出,所有的id(a)均为同一值,说明在函数中和全局的数组修改是同一个数组。在python中数组作为参数的传递方式,是类似于引用传递,或地址传递的方式。这里不用加global语句,因为本来就是读取的全局变量。

c = {}
print(id(c))


def func_value_(dic):
    print()
    print('在func_value_ 函数中 修改前 id(c) 为:',id(dic))
    dic['d'] = 88
    print('在func_value_ 函数中 修改后 id(c) 为:',id(dic))
    


def add_item():
    print()
    print('在additem 函数中 修改前 id(c) 为:',id(c))
    c['a'] = 99
    print('在additem 函数中 修改后 id(c) 为:',id(c))


def print_c():
    print()
    print(c)
    print('函数print c中 id c : ',id(c))

print_c()
add_item()
print_c()
func_value_(c)
print_c()

print('\n\n\n\n','='*20,'')

在这里插入图片描述

# set 类型
e = set()
print(id(e))
def add_item_set():
    #global e
    e.add(3)
    print(id(e))
add_item_set()
print(e)
print(id(e))

在这里插入图片描述

# 其他数据类型 Lock 类型
import threading

lock = threading.Lock()
print(id(lock))

def lock_test():
    print(id(lock))
    lock.acquire()
    print(id(lock))
lock_test()

在这里插入图片描述

结论

1、不可变数据类型 数字型、字符串型、元组 在使用时,如果不通过global关键字无法对全局变量进行修改(可以读取)。

2、可变类型、自定义类型 如 数组、set、字典类型 ,可以直接在函数中(不通过global关键字)即可修改全局变量。

3、如果通过传参方式,数字型、字符串型、元组 修改的是局部变量,需要通过返回值接收的方式修改全局变量。

4、可变类型如果通过传参方式传入函数中,也可直接修改全局变量。

5、在对数组、字典修改时,可以省略global关键字,数字型、字符串型、元组不可以。

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

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

相关文章

【C++修炼之路】C++入门(下)

👑作者主页:安 度 因 🏠学习社区:StackFrame 📖专栏链接:C修炼之路 文章目录一、前言二、内联函数1、概念2、特性三、auto(C 11)1、概念2、价值3、三个不能四、范围for循环(C11)1、基本使用2、使…

MySQL基础(3)—— MySQL数据类型

文章目录数值类型1、整数类型2、浮点数类型3、定点数类型日期和时间类型1、YEAR2、DATE、TIME、DATETIME3、TIMESTAMP字符串类型1、CHAR(M)2、VARCHAR(M)3、各种 TEXT 类型4、ENUM 类型和 SET 类型二进制类型1、BIT 类型2、BINARY(M) 与 VARBINARY(M)3、BLOB 类型MySQL说到底就…

移动出行2023:聊以新颜待今朝

兔年春节期间,城市再现浓浓烟火气。预订全满的年夜饭、排不到号的奶茶店以及火爆的电影票房等,证明着“吃、游、购、娱”等需求集中释放的“威力”。根据国家税务总局发布的最新数据,今年春节假期,全国消费相关行业销售收入与上年…

最长上升子序列问题(LIS问题)与最长不上升子序列问题的四种方法(c++ 模板代码)

文章目录动态规划树状数组线段树二分查找最大上升子序列问题也叫做LIS问题,与最大公共子序列LCS问题是一类经典问题,在本章我们将总结一下求解LIS最大上升子序列的几种方法,同时也会给出对应的最大不上升子序列的求解方法。 关于LCS问题&…

【表格单元格可编辑】vue-elementul简单实现table表格点击单元格可编辑,点击单元格变成输入框修改数据

前言 这是最近遇到的功能,经常会需要一个表格可以编辑数据 类似于excel那种点击一下单元格就可以编辑数据,修改后鼠标移动出去 光标消失就会保存数据给后台 这里记录一下实现方法,其实也比较简单 就是通过角标来判断显示隐藏的 效果图 代码…

[Android开发基础4] 点击事件的响应与处理

文章目录 方法一:控件的onClick属性 方法二:内部类 方法一:控件的onClick属性 利用控件自带的onClick属性,指定事件处理函数名称即可实现控件点击事件的处理 这里有个小技巧就是当设置完控件的onClick属性后,它会报没…

XXE漏洞常见利用点总结

目录 知识点小结 常用payload 本地文件读取 SSRF 引入外部实体 dtd 信息探测 XXE漏洞攻击 案例演示 案例一(有回显) 案例二(无回显读取本地敏感文件(Blind OOB XXE)) XXE 防御 使用语言中推荐的禁用外部实体的方法 知…

08-linux网络管理-iftop命令详解

文章目录1. 安装2. 基本使用2.1 命令2.2 输出2.3 说明3. 选项3.1 选项说明3.2 几个示例-n(不查找主机名)-i (查看指定网卡流量)-P(显示主机端口)-t(不使用ncurses 界面)4. ncurses界…

IDEA集成Docker插件实现一键自动打包部署

一. 概述 大家部署项目的时候,动辄十几个服务,每次修改逐一部署繁琐不说也会浪费越来越多时间,所以本篇整理通过一次性配置实现一键部署微服务,直接上教程。 二. 配置服务器 1、Docker安装 服务器需要安装Docker,如…

iOS单元测试怎么写 ?

iOS单元测试怎么写 ? 什么是单元测试 ? 针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。对于面向对象编程,最小单元就是方法 iOS 集成了自己的测试框架 OCUnit 和 UITests 为什么单元测试 ? 执行单元测试&#x…

网络基础2-3 ---传输层的UDP协议:DP的特点,UDP的协议格式,UDP的应用

目录 一、tcpdump命令 二、UDP协议 前言 2.1、UDP协议的特点: 2.2、UDP的协议格式 16位的UDP长度: 结合抓包工具:分析一下UDP协议,就利用我们之前写的udp_socket编程 16位的校验和: 2.3、UDP的应用&#xff1…

Python的序列结构及常用操作方法,学完这一篇你就彻底懂了

上一篇:Python流程控制语句之跳转语句 文章目录前言一、索引二、切片三、序列相加四、乘法五、检查某个元素是否是序列的成员六、计算序列的长度、最大值和最小值总结前言 序列是一块用于存放多个值的连续内存空间,并且按一定顺序排列,每个值…

【论文阅读】Cleanits: A Data Cleaning System for Industrial Time Series

论文来源 标题: Cleanits (Xiaoou Ding,2019) 作者: Xiaoou Ding, Hongzhi Wang, Jiaxuan Su, Zijue Li, Jianzhong Li, Hong Gao 期刊: Proceedings of the VLDB Endowment 研究问题 工业时间序列数据清洗系统 1)缺失值插补,2)匹配不一致…

Maven可选依赖与排除依赖

可选依赖——指的是对外隐藏当前所依赖的资源(不透明) 可选依赖的作用:是隐藏所使用的依赖,用于控制当前依赖资源能否被别人发现 可选依赖的含义:当前工程所依赖的资源,不被其他项目所调用此依赖 pom文件…

DolphinScheduler 3.1.0 海豚集群运维使用问题记录

文章目录海豚常见问题1. 认证问题2. 时区问题3. jdk问题导致的认证问题4. 海豚调度sqoop任务问题(1. 海豚不允许脚本有空行出现(2. 脚本调脚本:权限不足(3. 直接执行某个表的sqoop同步任务:(4. sudo权限不足5. 海豚配置hive/impala数据源问题(1.海豚连接hive数据源配置(2. 配置…

[架构之路-97]:《软件架构设计:程序员向架构师转型必备》-7-需求分析与业务需求领域建模

前言:需求分析工程师工作中业务领域,而业务领域有很多业务领域专有的概念;程序员主要工作在计算机领域,他们没有足够的业务领域的知识识别业务领域的过于专业化的业务需求。为了确保业务需求能够被软件工程师正确无误地实现&#…

《MFC编程》:第一个MFC程序

《MFC编程》&#xff1a;第一个MFC程序《MFC编程》&#xff1a;第一个MFC程序设置开发环境如何把一个win32程序改成MFC程序&#xff1f;代码书写《MFC编程》&#xff1a;第一个MFC程序 设置开发环境 头文件为<afxwin.h>&#xff1b;在设置中勾选“使用MFC库”。 注&…

53.Isaac教程--ZED相机

ZED相机 ISAAC教程合集地址文章目录ZED相机Codelets支持的固件下载出厂校准文件通过本地校准提高相机精度为相机校准文件指定自定义位置Isaac SDK 支持 StereoLabs ZED 和 ZED Mini (ZED-M) 以及 ZED2 立体相机。 使用本节中的程序下载出厂校准文件或在相机上执行本地校准。 …

看涨期权与看跌期权

目录 1. 看涨期权多头 2. 看涨期权空头 3. 看跌期权多头 4. 看跌期权空头 买进期货合约者称为多头&#xff0c;卖出股指期货合约者称为空头。 1. 看涨期权多头 买入沪深 300 指数的看涨期权&#xff0c;行权价 2000 点&#xff0c;期限 1 个月期权费 100 点1 点 100 元初…

PMP和ACP哪个更有用?

PMP证书和ACP证书都是项目管理类的证书&#xff0c;但是方向不一样&#xff0c;ACP特别验证了从业者在项目工作中理解及实施敏捷管理原则与实践的能力&#xff0c;PMP则认证了从业者所表现出的领导和引导项目团队的能力。 PMP是传统的项目管理模式&#xff0c;适合各行各业&am…