如何在函数中创建或使用全局变量?
如何在其他函数中使用一个函数中定义的全局变量?
未能在适当的地方使用全局关键字通常会导致UnboundLocalError。在第一次使用后重新分配局部变量时,UnboundLocalError中解释了这方面的精确规则。一般来说,当寻求解释时,请将其他问题作为该问题的副本,当某人只需要知道全局关键字时,请关闭该问题。
如何在函数中创建或使用全局变量?
如何在其他函数中使用一个函数中定义的全局变量?
未能在适当的地方使用全局关键字通常会导致UnboundLocalError。在第一次使用后重新分配局部变量时,UnboundLocalError中解释了这方面的精确规则。一般来说,当寻求解释时,请将其他问题作为该问题的副本,当某人只需要知道全局关键字时,请关闭该问题。
当前回答
全局变量很好-除了多处理
与不同平台/环境上的多处理相关的全局变量因为一边是Windows/Mac OS,另一边是Linux,这很麻烦。
我将用一个简单的例子向你展示这一点,指出我前段时间遇到的一个问题。
如果你想了解为什么Windows/MacOs和Linux上的情况不同需要知道的是,启动新进程的默认机制。。。
Windows/MacOs是“种子”Linux是“fork”
它们在内存分配和初始化方面有所不同。。。(但我不想谈这个此处)。
让我们看看这个问题/例子。。。
import multiprocessing
counter = 0
def do(task_id):
global counter
counter +=1
print(f'task {task_id}: counter = {counter}')
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=4)
task_ids = list(range(4))
pool.map(do, task_ids)
窗户
如果你在Windows上运行这个(我想也是在MacOS上),你会得到以下输出。。。
task 0: counter = 1
task 1: counter = 2
task 2: counter = 3
task 3: counter = 4
Linux系统
如果您在Linux上运行此程序,则会得到以下结果。
task 0: counter = 1
task 1: counter = 1
task 2: counter = 1
task 3: counter = 1
其他回答
您的意思是使用以下方法:
globvar = 5
def f():
var = globvar
print(var)
f() # Prints 5
但更好的方法是像这样使用全局变量:
globvar = 5
def f():
global globvar
print(globvar)
f() #prints 5
两者的输出相同。
如果我正确理解了您的情况,那么您看到的是Python如何处理本地(函数)和全局(模块)命名空间的结果。
假设你有这样一个模块:
# sample.py
_my_global = 5
def func1():
_my_global = 42
def func2():
print _my_global
func1()
func2()
您可能希望它打印42,但实际上它打印5。如上所述,如果向func1()添加一个“全局”声明,那么func2()将打印42。
def func1():
global _my_global
_my_global = 42
这里发生的情况是,Python假设在函数中的任何地方,任何分配给的名称都是该函数的本地名称,除非另有明确说明。如果它只是从一个名称中读取,并且该名称在本地不存在,那么它将尝试在任何包含范围(例如模块的全局范围)中查找该名称。
因此,当将42指定给名称_my_global时,Python将创建一个局部变量,该变量将覆盖同名的全局变量。当func1()返回时,该local超出范围并被垃圾收集;同时,func2()只能看到(未修改的)全局名称。请注意,这个命名空间决定发生在编译时,而不是在运行时——如果在赋值之前读取func1()内部的_my_global值,则会得到UnboundLocalError,因为Python已经决定它必须是一个本地变量,但它还没有与之关联的任何值。但通过使用“global”语句,您告诉Python应该在其他地方查找名称,而不是在本地分配。
(我认为,这种行为主要源于对本地名称空间的优化——如果没有这种行为,Python的VM每次在函数内部分配新名称时都需要执行至少三次名称查找(以确保该名称在模块/内置级别上不存在),这将大大降低非常常见的操作速度。)
Initialized = 0 #Here This Initialized is global variable
def Initialize():
print("Initialized!")
Initialized = 1 #This is local variable and assigning 1 to local variable
while Initialized == 0:
这里我们比较全局变量Initialized为0,因此当循环条件为true时
Initialize()
函数将被调用。循环将是无限的
#if we do Initialized=1 then loop will terminate
else:
print("Lets do something else now!")
全局变量很好-除了多处理
与不同平台/环境上的多处理相关的全局变量因为一边是Windows/Mac OS,另一边是Linux,这很麻烦。
我将用一个简单的例子向你展示这一点,指出我前段时间遇到的一个问题。
如果你想了解为什么Windows/MacOs和Linux上的情况不同需要知道的是,启动新进程的默认机制。。。
Windows/MacOs是“种子”Linux是“fork”
它们在内存分配和初始化方面有所不同。。。(但我不想谈这个此处)。
让我们看看这个问题/例子。。。
import multiprocessing
counter = 0
def do(task_id):
global counter
counter +=1
print(f'task {task_id}: counter = {counter}')
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=4)
task_ids = list(range(4))
pool.map(do, task_ids)
窗户
如果你在Windows上运行这个(我想也是在MacOS上),你会得到以下输出。。。
task 0: counter = 1
task 1: counter = 2
task 2: counter = 3
task 3: counter = 4
Linux系统
如果您在Linux上运行此程序,则会得到以下结果。
task 0: counter = 1
task 1: counter = 1
task 2: counter = 1
task 3: counter = 1
您需要在每个要使用的函数中引用全局变量。
如下:
var = "test"
def printGlobalText():
global var #wWe are telling to explicitly use the global version
var = "global from printGlobalText fun."
print "var from printGlobalText: " + var
def printLocalText():
#We are NOT telling to explicitly use the global version, so we are creating a local variable
var = "local version from printLocalText fun"
print "var from printLocalText: " + var
printGlobalText()
printLocalText()
"""
Output Result:
var from printGlobalText: global from printGlobalText fun.
var from printLocalText: local version from printLocalText
[Finished in 0.1s]
"""