python在函数中更改外部变量值

目录

前言

列表、字典(可变对象)

元组(不可变对象)

全局变量


前言

今天在写LeetCode题时,发现一个问题我并没有掌握,那就是如何在Python的函数中更改变量值(包括列表,字典,元组,数值等),经过搜集资料与自己验证,我渐渐明白这个知识点。

这里说的是改变变量的值,如果仅是需要变量改变后的值,只需 return 所需值即可。


列表、字典(可变对象)

对于可变对象(如列表、字典)的参数传递,是传递的对象的引用。在函数中引用后,用下标(字典是键值)访问或利用append()等函数进行修改,是可以在函数外体现出改变的

如:

列表:

def modify_list(lst):
    lst[0] = 100  # 修改列表的第一个元素
    lst.append(200)  # 在列表末尾添加一个新元素
    lst.extend([1,2,3])#末尾添加三个数
    del lst[-1]#末尾删除一个数
    lst.pop()#末尾删除一个数
    lst.insert(1,66)#插入一个数

# 声明一个列表
my_list = [1, 2, 3]

print("修改前:", my_list)
modify_list(my_list)
print("修改后:", my_list)

字典: 

def modify_dict(dic):
    dic[1]=25   # 修改键值为1的内容
    dic['o']='my'#增加键值
    del dic[0]#删除键值

#声明一个字典
my_dict={1:"ok",0:56}
print("修改之前",my_dict)
modify_dict(my_dict)
print("修改之后",my_dict)

但之后我遇到一个问题,原代码是:

class Solution(object):
    def removeDuplicates(self, nums):
        s=set(nums)
        nums=list(s)
        return len(nums)
A=Solution()
nums=[1,1,2,3,4,4]
k=A.removeDuplicates(nums)
print(k,nums)

 

在这段代码中,nums的内容并没有被改变,这是为什么呢?

经过搜集资料与思考,我找到了原因:

在这段代码中,nums列表虽然被传递给函数 removeDuplicates,并在函数中对 nums 进行了修改操作,但是这里需要注意的是,对于可变对象(如列表)的参数传递,是传递的对象的引用。

在函数内部执行 nums=list(s) 时,实际上创建了一个新的列表,并将该列表的引用赋值给了局部变量 nums。因此,对 nums 的修改只会影响到函数内部的局部变量,在函数结束后,这个局部变量将会被销毁,原始的 nums 列表并没有改变。

如果希望在函数中修改原始列表,可以直接使用切片操作,将集合 s 中的元素更新到原始列表中,示例如下:

class Solution(object):
    def removeDuplicates(self, nums):
        s=set(nums)
        nums[:]=list(s)
        return len(nums)
A=Solution()
nums=[1,1,2,3,4,4]
k=A.removeDuplicates(nums)
print(k,nums)

在这个示例中,通过使用切片操作 nums[:] = list(s),将集合 s 转换成列表,并直接更新到原始列表 nums 中。这样就可以修改原始列表的值,并且在函数结束后,原始列表的值也被相应地更改了。

两段代码的结果分别是:

 为了更好地说明,我输出了二者的ID:
 

def func1( nums):
        s=set(nums)
        nums=list(s)
        print("函数1中:",id(nums))
        return len(nums)
def func2( nums):
        s=set(nums)
        nums[:]=list(s)
        print("函数2中:",id(nums))
        return len(nums)
nums=[1,1,2,3,4,4]
print("函数外",id(nums))
k=func1(nums)
k=func2(nums)
print("函数外",id(nums))

# 结果:
#     函数外 2340821850560
#     函数1中: 2340825133376
#     函数2中: 2340821850560
#     函数外 2340821850560

可以看出,在 函数func1 中的ID与其他都不同,意味着创建了一个新的局部变量列表。当然,如果仅是需要该值,return 即可。


元组(不可变对象)

在Python中,元组(tuple)是不可变对象,即元组的值不能被修改。因此,无法直接在函数中修改元组的值。

当你将一个元组作为参数传递给函数时,实际上是将元组的引用传递给了函数。函数内部可以访问元组的值,但无法对其进行修改。

如果你需要在函数中修改元组的值,一种常见的方法是将元组转换为可变对象(如列表),在函数内部对可变对象进行修改后,再将其转换回元组。

以下是一个示例代码,展示了如何通过转换为列表来修改元组的值:

def modify_tuple(t):
    lst = list(t)  # 将元组转换为列表
    lst[0] = 100  # 修改列表的第一个元素
    # 进行其他操作...
    modified_tuple = tuple(lst)  # 将列表转换回元组
    return modified_tuple

# 声明一个元组
my_tuple = (1, 2, 3)

print("修改前:", my_tuple)
modified_tuple = modify_tuple(my_tuple)
print("修改后:", modified_tuple)

结果:

修改前: (1, 2, 3)
修改后: (100, 2, 3)

在上述示例中,modify_tuple 函数接受一个元组作为参数,并将该元组转换为列表。函数内部可以对列表进行修改,例如修改索引为0的元素为100。完成修改后,再将列表转换回元组,并将其返回。

需要注意的是,通过这种方式修改元组的值实际上是创建了一个新的元组,而不是直接在原始元组上进行修改。因为元组是不可变对象,在创建后无法修改其值。所以在函数调用后,原始元组的值并没有改变,而是返回了一个新的修改后的元组


全局变量

在 Python 中,当你在函数内部想要修改全局变量的值时,需要使用 global 关键字将变量声明为全局变量。

下面是一个示例代码,展示了如何在函数内部修改全局变量的值:

count = 0  # 全局变量

def increment():
    global count  # 声明 count 为全局变量
    count += 1  # 修改全局变量的值

print("初始值:", count)
increment()
print("修改后的值:", count)

结果:

               初始值: 0       
               修改后的值: 1

在上述示例中,count 是一个全局变量,在函数 increment 中我们想要将其值加1。为了告诉 Python 解释器在函数中使用全局变量 count,我们需要在 increment 函数内使用 global 关键字进行声明。

在函数内部使用 global count 表示 count 是一个全局变量,而不是函数内部的局部变量。这样,我们可以对全局变量 count 进行修改操作,使其增加1。

需要注意的是,在函数内部使用 global 声明全局变量后,对该变量的任何修改都会影响到全局作用域,因此要谨慎使用全局变量。通常,推荐在函数中通过参数传递和返回值来获取和修改变量的值,以避免全局变量带来的副作用。

def fun1(n):
    global n
    n=5
n=2
print(n)
fun1(n)
print(n)

注意上面代码是错误的,因为在全局声明之前分配了“n”,可改为:

def fun1():
    global n
    n=5
n=2
print(n)
fun1()
print(n)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用自适应去噪在线顺序极限学习机预测飞机发动机剩余使用寿命(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

如何在终端设置代理(设置jupyter notebook同理)

设置代理 在终端(我用的gitbash)下执行 set HTTP_PROXYhttp://<user>:<password><proxy server>:<proxy port> set HTTPS_PROXYhttp://<user>:<password><proxy server>:<proxy port>其中&#xff1a; user、password&#…

环球数科、BUFFALO面试(部分)

环球数科 系统复杂且需求迭代频繁&#xff0c;如何维护微服务之间的接口调用关系&#xff1f; API接口在设计的时候需要大量的需求文档&#xff0c;而且文档也需要不断维护。如何高效维护API文档就很重要了。以下是一些常见的API管理工具&#xff1a;Swagger&#xff1a;Swag…

python机器学习(七)决策树(下) 特征工程、字典特征、文本特征、决策树算法API、可视化、解决回归问题

决策树算法 特征工程-特征提取 特征提取就是将任意数据转换为可用于机器学习的数字特征。计算机无法直接识别字符串&#xff0c;将字符串转换为机器可以读懂的数字特征&#xff0c;才能让计算机理解该字符串(特征)表达的意义。 主要分为&#xff1a;字典特征提取(特征离散化)…

zabbix监控mysql容器主从同步状态并告警钉钉/企业微信

前言&#xff1a;被监控的主机已经安装和配置mysql主从同步&#xff0c;和zabbix-agent插件。 mysql创建主从同步&#xff1a;http://t.csdn.cn/P4MYq centos安装zabbix-agent2&#xff1a;http://t.csdn.cn/fx74i mysql主从同步&#xff0c;主要监控这2个参数指标&#xf…

JavaScript 中的隐式类型转换

一、什么情况会发生隐式类型转换&#xff1f; 1、加号&#xff08;&#xff09; 号比较特殊&#xff0c;既可以当做算数运算符做加法&#xff0c;又可以当做字符串连接符 ① 算数运算符 除了 string 类型以外的原始数据类型进行加法运算时&#xff0c;非数字类型会转换为数字…

unity制作FPS射击游戏

文章目录 介绍鼠标移动控制视角行走、奔跑、跳跃、下蹲射击、后坐力、射速、瞄准、弹痕、枪火、抛壳手臂摇摆手枪切枪效果动画状态机玩家血量新地图场景颜色渐变激光墙获取钥匙滑动门NPC属性攻击逻辑终点传送门 介绍 角色动作方面包括行走、奔跑、跳跃、武器切换、弹夹更换、武…

科技引领,教育革新|EasyV助力数字孪生智慧教育建设!

数字孪生校园是以物联网、大数据、云计算、人工智能、三维可视化等新型数字化技术为基础&#xff0c;构建的数智校园的“大脑”。对校园的人、车、资产设施、各业务系统进行全联接&#xff0c;实现数据全融合、状态全可视、业务全可管、事件全可控&#xff0c;使校园更安全、更…

elasticSearch常见的面试题

常见的面试问题 描述使用场景 es集群架构3个节点&#xff0c;根据不同的服务创建不同的索引&#xff0c;根据日期和环境&#xff0c;平均每天递增60*2&#xff0c;大约60Gb的数据。 调优技巧 原文参考&#xff1a;干货 | BAT等一线大厂 Elasticsearch面试题解读 - 掘金 设计阶…

【《快速构建AI应用——AWS无服务器AI应用实战》——基于云的解决方案快速完成人工智能项目的指南】

基于云的人工智能服务可以自动完成客户服务、数据分析和财务报告等领域的各种劳动密集型任务。其秘诀在于运用预先构建的工具&#xff0c;例如用于图像分析的Amazon Rekognition或用于自然语言处理的AWS Comprehend。这样&#xff0c;就无须创建昂贵的定制软件系统。 《快速构…

PADS过孔操作

过孔须先在Layout内设置好类型&#xff0c;然后在“过孔配置”选项页将使用的过孔勾选。 2&#xff09;有多个过孔类型&#xff0c;可以先指定当前设计时使用的过孔类型。布线操作期间&#xff0c;右击在“过孔类型”选项内选择“通孔类过孔”或者“自动类过孔”&#xff0c;选…

探索产品项目管理软件的种类及功能

随着科技的不断发展&#xff0c;越来越多的企业开始重视产品项目管理的重要性。产品项目管理软件作为一种有效的工具&#xff0c;可以帮助企业更好地规划、执行和控制项目&#xff0c;提高项目的成功率。本文将分为两部分&#xff0c;分别介绍产品项目管理软件的功能以及一些知…

MySQL数据库安装(二)

夕阳留恋的不是黄昏&#xff0c;而是朝阳 上一章简单介绍了MySQL数据库概述(一), 如果没有看过, 请观看上一章 一. MySQL 卸载 一.一 停止MySQL服务 在卸载之前&#xff0c;先停止MySQL8.0的服务。按键盘上的“Ctrl Alt Delete”组合键&#xff0c;打开“任务管理器”对话…

Ubuntu服务器ELK部署与实践

文章目录 1. Docker安装2. 拉镜象2.1 ElastciSearch2.2 Kibana2.3 logstash 3. 数据展示 1. Docker安装 看之前的文章 docker ubuntu完全卸载docker及再次安装 Ubuntu安装 Docker 此外&#xff0c;Docker偶尔会出现这种问题dial tcp: lookup registry-1.docker.io on 192.168.1…

React 之 Redux - 状态管理

一、前言 1. 纯函数 函数式编程中有一个非常重要的概念叫纯函数&#xff0c;JavaScript符合函数式编程的范式&#xff0c;所以也有纯函数的概念 确定的输入&#xff0c;一定会产生确定的输出 函数在执行过程中&#xff0c;不能产生副作用 2. 副作用 表示在执行一个函数时&a…

基于Java+SpringBoot+SpringCloud+Vue的智慧养老平台设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

C++入门篇6 C++的内存管理

在学习C的内存管理之前&#xff0c;我们先来回顾一下C语言中动态内存 int main() {int* p1 (int*)malloc(sizeof(int));free(p1);// 1.malloc/calloc/realloc的区别是什么&#xff1f;int* p2 (int*)calloc(4, sizeof(int));//calloc 可以初始化空间为0int* p3 (int*)reall…

Set-up ESP-AT Environment on Windows using CMD

Before you start, the following environments need to be installed: Git BashPython environment, suggest Python version: 3.8.7. Please ensure the installation of Python v3.8 version environment, and remember to select the option “add to PATH” during the in…

TCP Socket 基础知识点(实例是以Java进行演示)

本篇根据TCP & Socket 相关知识点和学习所得进行整理所得。 文章目录 前言1. TCP相关知识点1.1 双工/单工1.2 TCP协议的主要特点1.3 TCP的可靠性原理1.4 报文段1.4.1 端口1.4.2 seq序号1.4.3 ack确认号1.4.4 数据偏移1.4.5 保留1.4.6 控制位1.4.7 窗口1.4.8 校验和1.4.9 紧…

无人机管控平台,推动电力巡检管理水平提升

各地区无人机作业水平和管理水平存在参差不齐&#xff0c;电力巡检管理要求与业务发展水平不匹配的问题。同时&#xff0c;巡检数据的存储和管理分散&#xff0c;缺乏有效的整合与共享手段&#xff0c;使得内外业脱节&#xff0c;没有形成统一应用和闭环管理。这就导致巡检数据…