python中的global和nonlocal关键字以及闭包和模块

news2024/10/17 2:41:12

  global i 这样的用法在于 Python 中,但需要在一个函数内部使用,以便将变量 i 声明为全局变量。让我们来详细讲解一下它的用法。

什么是全局变量?

        全局变量是指在函数外部定义的变量,可以在任何函数中访问和修改。如果你需要在函数内部修改一个全局变量,必须使用 global 关键字来声明该变量。

示例

以下是一个简单的示例,演示如何正确使用 global 关键字:

i = 0  # 定义一个全局变量

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

# 调用函数 increment
increment()
print(i)  # 输出: 1

关键点

  1. 位置:全局变量需要在函数外部定义。
  2. 声明:在修改全局变量之前,必须在函数内部使用 global 关键字声明这个变量。
  3. 作用域:如果不使用 global,则在函数中对 i 的任何修改都会被视为对局部变量的操作,不会影响到全局变量。

使用场景

        使用 global 关键字的场景通常限于简单的程序或脚本中不需要封装的变量。如果可能,尽量使用参数和返回值,保持较好的代码结构和可维护性。

        在Python中,除了使用 global 关键字来声明全局变量,以下是一些最常用的方法来处理变量的作用域和访问:

函数参数传递

通过函数参数将变量传递给函数。这是最常见和推荐的做法。

def my_function(param):
    print(param)

my_variable = 10
my_function(my_variable)

返回值

使用函数的返回值来传递数据。

def calculate():
    x = 10
    y = 20
    return x + y

result = calculate()
print(result)  # 输出: 30

类和对象

使用类和对象来封装数据和方法,通过对象的属性来访问数据。

class MyClass:
    def __init__(self, value):
        self.value = value

    def display(self):
        print(self.value)

obj = MyClass(10)
obj.display()  # 输出: 10

闭包(Closure)

使用闭包来捕获外部函数的变量。

def outer_function(x):
    def inner_function(y):
        return x + y
    return inner_function

closure = outer_function(10)
result = closure(20)
print(result)  # 输出: 30

 nonlocal 关键字

在嵌套函数中,使用 nonlocal 关键字来修改外部函数的变量。

def outer_function():
    x = 10
    def inner_function():
        nonlocal x
        x = 20
    inner_function()
    return x

result = outer_function()
print(result)  # 输出: 20

模块

将变量定义在模块级别,并通过导入模块来访问这些变量。

# my_module.py
my_variable = 10
# main.py
import my_module

print(my_module.my_variable)  # 输出: 10

上下文管理器

使用上下文管理器来管理资源,并在 with 语句块中访问资源。

class MyContextManager:
    def __enter__(self):
        self.value = 10
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        pass

with MyContextManager() as context:
    print(context.value)  # 输出: 10

        这些方法可以帮助你在不使用 global 关键字的情况下,有效地管理变量的作用域和访问。

 

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

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

相关文章

老照片修复工作流教程:用 ComfyUI 轻松还原历史记忆

你是否有过这样的遗憾? 那些珍贵的老照片因为时间的流逝,早已失去了当年的色彩,变得模糊、褪色,甚至破损? 今天带你了解如何使用 ComfyUI 的老照片修复工作流,通过简单的几步操作,在短短十几秒…

三亚旅游微信小程序的设计与实现

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不…

【深度学习代码调试1】环境配置篇(上) -- 安装PyTorch(安利方法:移除所有国内源,使用默认源)

【深度学习代码调试1】环境配置篇 -- 安装TensorFlow和PyTorch 写在最前面1. 创建新的Conda环境2. 安装PyTorch及相关库(可以直接跳到2.3安装方法)2.1 检查CUDA版本2.2 解决安装过程中常见问题2.2.1 超时问题(这个不是最终解决方案&#xff0…

AUTOSAR_EXP_ARAComAPI的5章笔记(13)

☞返回总目录 5.4.7 事件(Events) 在骨架侧,服务实现负责通知事件的发生。如 5.4.2 RadarService Skeleton Class 所示,骨架为每个事件提供一个事件包装类的成员。骨架的事件包装类与代理的事件包装类看起来明显不同。 在骨架端…

论文阅读:On determining the hinterlands of China‘s foreign trade container ports

集装箱港口腹地的边界线,只要存在,就可以作为未来港口发展和基础设施规划的参考点。在早期划定中国港口腹地的努力中,要么考虑的港口数量有限,要么仅根据港口总吞吐量划定腹地。因此,这些研究都没有让我们清楚地了解共…

快速理解AUTOSAR CP的软件架构层次以及各层的作用

在 AUTOSAR CP 的架构中,软件分为 应用层 (App)、运行时环境 (RTE) 和 基础软件层 (BSW) 三个主要层级。下面是每一层的主要功能与简单的代码示例来展示它们之间的关系。 1. 概述 应用层 (App):包含应用程序代码,主要实现业务逻辑。应用层通…

DeepFM模型代码详解

直到看到这篇文章,我才搞明白类别特征怎么做lookup的,也看明白了代码逻辑。如果你看完没懂,私信留下wx,给你讲懂。 1、Deepfm 的原理,DeepFM 是一个模型还是代表了一类模型,DeepFM 对 FM 做了什么样的改进…

【时时三省】(C语言基础)函数介绍strcat

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 strcat 字符串追加 示例: 比如我要把world加到hello后面去 就可以用这个 还有一种方法是这样 这两个代码的意思是一样的 只是写法不一样 写的时候要注意这些 •源字符串必须…

DAB-DETR: DYNAMIC ANCHOR BOXES ARE BETTER QUERIES FOR DETR论文笔记

原文链接 [2201.12329] DAB-DETR: Dynamic Anchor Boxes are Better Queries for DETR (arxiv.org)https://arxiv.org/abs/2201.12329 原文笔记 在本文中,我们提出了一种新的查询公式,使用动态锚框进行DETR (DEtection TRansformer),并对查…

探索人工智能在数学教育上的应用——使用大规模语言模型解决数学问题的潜力和挑战

概述 论文地址:https://arxiv.org/abs/2402.00157 数学推理是人类智能的重要组成部分,人工智能界不断寻求应对数学挑战的方法,而在这一过程中,人工智能的能力需要进一步提高。从文本理解到图像解读,从表格分析到符号操…

大数据|MapReduce编程原理与应用

在大数据时代的浪潮中,MapReduce作为一种高效处理海量数据的编程模型,自其诞生以来便成为了数据处理领域的基石。本文旨在深入探讨MapReduce的基本原理、典型应用以及其在未来技术发展趋势中的展望,帮助读者更好地理解并应用这一关键技术。 一…

数制转换及交换机

数制转换 非位置化数字系统:罗马数字 位置化数字系统:二进制,八进制,十进制,十六进制 十进制数: 符号:2 2 2位置:2 1 0位权:该数字的真实大小 该位置上的数基数的位置…

如何设计开发RTSP直播播放器?

技术背景 我们在对接RTSP直播播放器相关技术诉求的时候,好多开发者,除了选用成熟的RTSP播放器外,还想知其然知其所以然,对RTSP播放器的整体开发有个基础的了解,方便方案之作和技术延伸。本文抛砖引玉,做个…

所有程序员的白嫖圣地-github

内容汇总 认识github页面如何从github下载资源git配置如何通过github管理工程代码 有人问github怎么用,几分钟了解这个每个程序员都在用的白嫖圣地。 打开github主界面,映入眼帘的是Home面板,它的作用是显示我们关注的人、点赞的项目等更新…

一款非常有用且高效的国产的Linux运维面板:1Panel介绍

1Panel介绍 一、1panel介绍二、1panel的安装1、不同系统安装2、安装日志3、访问地址 三、1panel的卸载1、停止服务2、卸载服务3、清理残留文件4、清除日志文件5、验证卸载是否成功 四、1panel的功能介绍1、服务器资源使用情况快速监控2、文件管理器简单易用3、创建和管理网站轻…

【Linux操作系统】进程等待

目录 一、什么是进程等待?二、为什么要进行等待?三、进程等待方法1.wait函数2.waitpid3.status阻塞等待和非阻塞等待(轮询等待)1.阻塞等待2.非阻塞等待 四、代码举例 一、什么是进程等待? "进程等待"是指一…

基于springboot摄影跟拍预定管理系统

作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 系统展示 【2024最新】基于JavaSpringBootVueMySQL的,前后端分离。 开发语言:Java数据库:MySQL技术:…

Finops成本优化企业实践-可规划篇

引言:本篇假设我们要在云上新增一个应用,讨论其在单体、failover、DR、集群模式下的成本规划。 假设该应用base on Linux,硬件要求是8cores、64G mem的云主机,并搭配500g内存,至少部署在一台云主机上。我们有开发、测…

Java项目: 基于SpringBoot+mysql+maven+vue林业产品推荐系统(含源码+数据库+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismavenvue林业产品推荐系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操…

【Linux】解锁软硬链接奥秘,高效动静态库管理的实战技巧

软硬连接和动静态库 1. 软链接1.1. 概念1.2. 特点1.3. 应用场景 2. 硬链接2.1. 概念2.2. 硬链计数2.3. 特点2.4. 应用场景 3. 动静态库3.1 库存在的原因3.2. 静态库制作与使用3.2.1 打包3.2.2. 使用 3.3. 动态库制作与使用3.3.1. 打包3.3.2. 使用 4. 解决动态库查不到的4种方法…