Python全局变量设置方法详解:使用global关键字、模块级别变量与单例模式
在 Python 里设置全局变量有以下几种方法:其一,使用 global 关键字;其二,定义在模块级别的变量;其三,使用单例模式。其中,使用 global 关键字是较为常见的方式,这种方式能够让在函数内部对全局变量的值进行修改。

在 Python 里,全局变量指的是在函数或者类的定义之外所声明的变量。这些变量能够在整个模块的范围内被访问以及被修改。接下来将会详细地讲解怎样在 Python 中去设置全局变量,同时也会对其使用的场景以及需要注意的事项进行讨论。
一、使用global关键字
1、定义和使用
在 Python 里,要是想在函数内部去修改全局变量的值,那就必须要用 global 关键字来声明这个变量。原因在于 Python 通常情况下在函数内部的变量属于局部变量,要是想引用全局变量的话,就需要用到 global 关键字。
x = 10
def modify_global():
global x
x = 20
modify_global()
print(x) # 输出 20
在上述示例里,变量 x 在函数 modify_global 里被重新赋予了值,并且这种变化在函数之外也是能够被看到的。
2、使用场景
使用 global 关键字的场景通常是在多个函数之间需要共享和修改某个变量的时候。比如,在一个简单的计数器程序里:
counter = 0
def increment():
global counter
counter += 1
def decrement():
global counter
counter -= 1
increment()
increment()
decrement()
print(counter) # 输出 1
在这个示例里,counter 变量既在这两个函数之间被共享,又被进行了修改。
二、定义在模块级别的变量
1、模块级别变量
在 Python 里,模块级别的变量指的是定义在模块最顶层的那些变量。这些变量在模块的任何位置都能够被访问到,也能够被修改。因为 Python 的模块本质上是对象,所以可以借助模块名来对这些变量进行引用。
# module1.py
x = 10
def modify():
global x
x = 20
main.py
import module1
print(module1.x) # 输出 10
module1.modify()
print(module1.x) # 输出 20
在这个示例里,module1 里面的变量 x 在 main.py 里被拿来引用并且被修改了。
2、使用场景
模块级别的全局变量一般是用来存储配置或状态信息的。比如,能够在一个配置模块里定义全局变量,以此来保存应用程序的配置。
# config.py
db_host = "localhost"
db_port = 5432
main.py
import config
输出 "localhost",即打印配置中的数据库主机地址为 "localhost"
config.db_host = "127.0.0.1"
输出 "127.0.0.1" ,这是通过执行 print(config.db_host) 得到的结果
在这个示例里,config 模块里的变量有 db_host 和 db_port,它们在 main.py 中被引用了,同时也被修改了。
三、使用单例模式
1、单例模式介绍
单例模式属于一种设计模式。它的作用是保证一个类仅有一个实例存在,并且还能提供全局的访问点。在 Python 里,能够通过构建一个单例类的方式来达成全局变量的效果。
class Singleton:
_instance = None
在类(cls)中定义了一个特殊的方法__new__,它可以接收任意数量的位置参数(*args)和关键字参数(kwargs)。
if not cls._instance:
cls 的 _instance 是通过 super(Singleton, cls).__new__(cls, *args, kwargs) 来创建的。
return cls._instance
singleton1 = Singleton()
singleton2 = Singleton()
输出 singleton1 与 singleton2 是否为同一个对象,结果为 True
在这个示例中,Singleton类确保只有一个实例被创建。
2、使用场景
单例模式一般在整个应用程序需要共享某一状态或配置的场景中被使用。比如,能够创建一个单例类,用以存储应用程序的配置。
class Config:
_instance = None
def __new__(cls, *args, kwargs):
if not cls._instance:
cls 的 _instance 通过 super(Config, cls) 的 __new__ 方法创建,创建时使用了 cls 以及传入的 *args 和 kwargs
cls._instance 的数据库主机为“localhost”。
cls._instance.db_port = 5432
return cls._instance
config1 = Config()
config2 = Config()
输出 "localhost",这是通过 print(config1.db_host) 实现的。
config2.db_host = "127.0.0.1"
输出 "127.0.0.1" ,这是通过执行 print(config1.db_host) 得到的结果。
输出 config1 与 config2 是否相等的结果,这里输出的是 True
在这个示例里,Config 类起到了这样的作用,即保证只有一个实例存在,同时这个实例的属性能够在应用程序里被共享。
四、使用全局字典
1、定义和使用
一种管理全局变量的方式是运用全局字典。全局字典能够存储多个全局变量,并且还能提供一种具备结构化特点的方式来对它们进行管理。
global_vars = {
"counter": 0,
"db_host": "localhost"
}
def increment_counter():
global_vars["counter"] += 1
def set_db_host(host):
global_vars["db_host"] = host
increment_counter()
set_db_host("127.0.0.1")
输出 global_vars 中 "counter" 的值,结果为 1
输出 global_vars 中 "db_host" 的值,其值为 "127.0.0.1"
在这个示例里,global_vars 这个字典把多个全局变量给存储了起来,并且这些全局变量还能通过函数来进行修改。
2、使用场景
使用全局字典的场景一般是在多个函数需要共享并管理多个全局变量的时候。比如,在一个较为复杂的应用程序里,能够利用全局字典来对应用程序的状态进行存储和管理。
app_state = {
"user_logged_in": False,
"current_user": None
}
def login(user):
app_state 中 "user_logged_in" 的值被设置为 True 。
app_state 中的“current_user”被设置为 user 。
def logout():
“user_logged_in”在 app_state 中被置为 False 。
app_state 中的“current_user”被设置为 None 。
login("Alice")
输出 app_state 中 "user_logged_in" 的值,其值为 True
输出 app_state 中 "current_user" 的值,该值为 "Alice"
logout()
输出 app_state["user_logged_in"] 的值,其值为 False
输出 app_state 中 "current_user" 的值,结果为 None
在这个示例里,app_state 这个字典用来存储应用程序的状态,并且可以通过函数来对其进行修改。
五、使用类属性
1、类属性定义和使用
在 Python 里,能够利用类属性去定义全局变量。类属性属于类,并非类的实例。正因如此,它们能在所有实例之间进行共享。
class GlobalVars:
counter = 0
def increment():
GlobalVars.counter += 1
increment()
increment()
输出 GlobalVars.counter 的值,其值为 2。
在这个示例里,GlobalVars 类的 counter 属性是在所有实例当中被共享的。
2、使用场景
使用类属性的场景一般是在需要多个类实例共享某个状态或配置的时候。比如,可以利用类属性来储存应用程序的配置。
class Config:
db_host = "localhost"
db_port = 5432
打印(Config.db_host) ,其输出为 "localhost" 。
Config.db_host = "127.0.0.1"
输出 Config.db_host 的值,其值为 "127.0.0.1"
在这个示例里,Config 类的属性 db_host 是在所有实例间进行共享的。Config 类的属性 db_port 也是在所有实例间进行共享的。
六、使用环境变量
1、定义和使用
环境变量属于操作系统层面的变量。在 Python 中,能够通过 os 模块来对其进行访问以及修改。环境变量一般是用来存储配置或者敏感信息的,像数据库连接字符串以及 API 密钥等。
import os
设置环境变量
os 中的环境变量 "DB_HOST" 被设置为 "localhost"
获取环境变量
db_host 等于 os 获取环境变量 "DB_HOST" 的值。
输出 "localhost" ,即打印 db_host 的值
修改环境变量
os 这个环境变量中的 "DB_HOST" 被设置为 "127.0.0.1" 。
db_host = os.getenv("DB_HOST")
输出 "127.0.0.1" ,这里是打印 db_host 。
在这个示例里,环境变量 DB_HOST 在 Python 环境下是可以被设置的,同时也能够被获取。
2、使用场景
使用环境变量的场景通常是在需要在多个应用程序或脚本之间共享配置或敏感信息的时候。比如,可以在 CI/CD 管道中利用环境变量来存储并传递配置。
# 假设在CI/CD管道中设置了环境变量 DB_HOST
import os
def get_db_host():
return os.getenv("DB_HOST")
输出 CI/CD 管道中设置的 DB_HOST 值,即打印(get_db_host())
在这个示例里,get_db_host 函数会返回环境变量 DB_HOST 的值,而这个值能够在 CI/CD 管道当中进行设置以及传递。
七、注意事项
1、命名冲突
使用全局变量时,要注意不能有命名冲突。一个较好的做法是给全局变量起有意义且独特的名字,这样就能避免和局部变量或者其他模块里的变量产生冲突。
2、可读性和可维护性
使用全局变量过多会让代码难以理解与维护。要尽量降低全局变量的使用频率,可通过使用函数参数、返回值或者类属性来传递和保存状态。
3、线程安全
在多线程的环境里,修改全局变量的时候需要格外留意。能够运用线程锁(例如 threading.Lock 这种),以此来保证对全局变量的修改具备线程安全性。
import threading
counter = 0
lock = threading.Lock()
def increment():
global counter
with lock:
counter += 1
threads = []
for _ in range(100):
创建一个线程对象 t,该线程的目标函数是 increment
threads.append(t)
t.start()
for t in threads:
t.join()
print(counter) # 输出 100
在这个示例里,通过使用线程锁来保障对全局变量 counter 的修改具备线程安全性。
八、总结
Python中设置全局变量的方式有很多种。可以使用 global 关键字,也可以将变量定义在模块级别。还能使用单例模式、全局字典、类属性以及环境变量。每种方式都有其特定的适用场景以及需要注意的事项。在实际的开发过程里,要依据具体的需求来挑选合适的方法,同时要留意代码的可读性、可维护性以及线程安全性。
如果项目管理有需求,且需要集成项目管理系统,那么可以考虑使用研发项目管理系统 PingCode 以及通用项目管理软件 Worktile。这两种系统能够帮助团队更好地对项目进行管理,同时也能提高工作效率。
相关问答FAQs:
1. 为什么要设置全局变量?
全局变量在 Python 中能够在整个程序范围内被访问以及修改。它可以在不同的函数之间或者模块当中方便地共享数据。这样一来,能够减少重复去定义变量所需要花费的工作量,同时还可以提升代码的可读性以及维护性。
2. 如何设置一个全局变量?
设置一个全局变量的方法是在函数外部定义一个变量,然后在函数内部使用 global 关键字将其声明为全局变量。例如:
global_var = 10
def my_function():
global global_var
global_var += 5
my_function()
print(global_var) # 输出15
3. 全局变量的注意事项有哪些?
在使用全局变量时需要注意以下几点: