python全局变量在整个程序内都有效_Python 全局变量使用

python全局变量在整个程序内都有效_Python 全局变量使用在平时的开发中我们有时候会用到全局变量 但是很多开发语言不允许使用或者建议少使用全局变量 Python 也是如此 但是有时候为了编写程序的方便和灵活 必须使用全局变量 这篇文章记录是我在使用 Python 全局变量的一些体会 写的不是很好 欢迎大家指正 一 使用全局变量首先展示一段不能修改全局变量的代码 gl string helloPython 定义全局变量 gl stringprint i

在平时的开发中我们有时候会用到全局变量,但是很多开发语言不允许使用或者建议少使用全局变量,Python也是如此。但是有时候为了编写程序的方便和灵活,必须使用全局变量。这篇文章记录是我在使用Python全局变量的一些体会,写的不是很好,欢迎大家指正!

一,使用全局变量

首先展示一段不能修改全局变量的代码:

gl_string =”hello Python” # 定义全局变量gl_string

print(id(gl_string))# 打印全局变量gl_string的内存地址

print(gl_string)

print(“开始全局打印———“)

# 函数1

def demo1():

gl_string =”hello Objc”

print(id(gl_string))

print(gl_string)

print(“demo1打印———“)

# 函数2

def demo2():

gl_string =”hello Java”

print(id(gl_string))

print(gl_string)

print(“demo2打印———“)

demo1() # 调用

demo2() # 调用

# 最后打印全局变量的信息

print(id(gl_string))

print(gl_string)

print(“最后全局打印———“)

打印结果如下:

hello Python

开始全局打印———

hello Objc

demo1打印———

hello Java

demo2打印———

hello Python

最后全局打印———

从打印的结果发现,每次在函数里面给gl_string变量进行赋值操作时,gl_string变量的内存地址都不一样,而且gl_string对应的值也不一样。从开始到结束的打印结果来看,全局变量gl_string内存地址和对应的值都没有发生改变。依此可以得出这样的结果:当在函数里面不添加其他操作的情况下是无法修改全局变量的,函数里面的对全局变量的赋值操作实际上是系统帮我们创建了一个跟全局变量同名的局部变量

二,如何修改全局变量

还是先看一段代码:

# 定义全局变量num

gl_string = “hello Python”

# 打印全局变量num的内存地址

print(id(gl_string))

print(gl_string)

print(“开始全局打印———“)

def demo1():

global gl_string

gl_string = “hello Objc”

print(id(gl_string))

print(gl_string)

print(“demo1打印———“)

def demo2():

gl_string = “hello Java”

print(id(gl_string))

print(gl_string)

print(“demo2打印———“)

demo1()

demo2()

print(id(gl_string))

print(gl_string)

print(“最后全局打印———“)

上面这段代码跟之前的那端段代码有一点区别,现在的这份代码在demo1里面添加了这句代码global gl_string,下面看看输出结果:

hello Python

开始全局打印———

hello Objc

demo1打印———

hello Java

demo2打印———

hello Objc

最后全局打印———

从输出结果可以看到,demo1里面的打印结果和程序结束时打印结果是一致的,而程序开始的结果和demo2里面的结果不一样。

我们现在demo2里面加一行代码再看看输出结果:

# 定义全局变量num

gl_string = “hello Python”

# 打印全局变量num的内存地址

print(id(gl_string))

print(gl_string)

print(“开始全局打印———“)

def demo1():

global gl_string

gl_string = “hello Objc”

print(id(gl_string))

print(gl_string)

print(“demo1打印———“)

def demo2():

global gl_string

gl_string = “hello Java”

print(id(gl_string))

print(gl_string)

print(“demo2打印———“)

demo1()

demo2()

print(id(gl_string))

print(gl_string)

print(“最后全局打印———“)

输出结果:

hello Python

开始全局打印———

hello Objc

demo1打印———

hello Java

demo2打印———

hello Java

最后全局打印———

从这次的输出结果可以看出,demo2和程序结束时打印的结果是一样的,而开始的打印结果和demo1里面的打印结果不一样。

从以上三段代码的打印结果最后的出如下的结论,在函数内部使用全局变量时,如果不添加global关键字修饰全局变量,那么我们在函数里面对全局变量的赋值操作实际上并不是对全局变量的赋值,而是创建了一个跟全局变量同名的局部变量。如果用global关键字修饰以后的全局变量,在函数内进行赋值操作时确实修改了全局函数的值,但这个也只是一个假象而已,因为在每次赋值时,全局变量的内存地址都在改变,系统只是将变量标识符指向了最新的内存地址而已,并不是在原来的内存地址是修改。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233225.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SSL工作原理

    SSL工作原理

    2021年12月14日
    38
  • Harris角点学习[通俗易懂]

    Harris角点学习[通俗易懂]人们普遍认为角点是二维图像亮度变化剧烈的点或图像边缘曲线上曲率极大值的点。这些点在保留图像图形重要特征的同时,可以有效地减少信息的数据量,使其信息的含量很高,有效地提高了计算的速度,有利于图像的可靠匹配,使得实时处理成为可能。其在三维场景重建、运动估计、目标跟踪、目标识别、图像配准与匹配等计算机视觉领域起着非常重要的作用。  角点的检测主要有两类基于图像边缘的方法和基于图像灰度的方法。前者很

    2022年9月25日
    2
  • lldp协议代码阅读_microsoft,lldp协议[通俗易懂]

    lldp协议代码阅读_microsoft,lldp协议[通俗易懂]第1页共17页竭诚为您提供优质文档/双击可除microsoft,lldp协议篇一:lldp协议配置指导lldp协议交换机配置指导802.lab链接层发现协议(linklayerdiscoveryprotocol),将能够使企业网络的故障查找变得更加容易,并加强网络管理工具在多厂商环境中发现和保持精确网络拓扑结构的能力。该协议可望在下月成为一项正式的标准。lldp是一种邻近发现协议。它为以太网网络设…

    2022年6月2日
    40
  • mac mysql忘记密码_centos6修改密码

    mac mysql忘记密码_centos6修改密码MacOS下brew安装的mysql重置密码1、进入mysql的bin路径cd/usr/local/Cellar/mysql/8.0.11/bin2、停止mysql服务./mysql.serverstop3、开启mysql安全模式./mysqld_safe–skip-grant-tables&4、进入mysqlmysql-uroot-p5、更改musql密码usemysqlflushprivileges;ALTERUSER’root’@’loca

    2022年10月15日
    0
  • 远程桌面 指定端口_request获取ip地址

    远程桌面 指定端口_request获取ip地址iocp模型的tcp服务端若采用AcceptEx接受连接,在有客户端连接后要获取客户端的ip和端口信息流程:AcceptEx在工作线程收到客户端连接时复制listensocket的信息到新客户端的socketsetsockopt(pOverlapped->hSocket,SOL_SOCKET,SO_UPDATE_ACCEPT_CONTEXT,(cha…

    2022年9月1日
    2
  • java创建线程池参数_java创建线程的四种方式

    java创建线程池参数_java创建线程的四种方式java如何创建线程池

    2022年9月28日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号