在函数中使用全局变量

Using global variables in a function

提问人:user46646 提问时间:1/8/2009 最后编辑:Karl Knechteluser46646 更新时间:5/4/2023 访问量:4010572

问:

如何在函数中创建或使用全局变量?

如何在其他函数中使用在一个函数中定义的全局变量?


如果未能在适当的情况下使用 global 关键字,通常会导致 UnboundLocalError。首次使用后重新赋值时,局部变量的 UnboundLocalError 中解释了此操作的确切规则。通常,当寻求解释时,请关闭其他问题作为该问题的副本,当有人只需要知道全局关键字时,请关闭问题。

python 全局变量 作用域

评论


答:

277赞 gimel 1/8/2009 #1

您可能想要探索命名空间的概念。在 Python 中,模块全局数据的自然位置:

每个模块都有自己的私有符号表,该表被模块中定义的所有函数用作全局符号表。因此,模块的作者可以在模块中使用全局变量,而不必担心与用户的全局变量发生意外冲突。另一方面,如果你知道自己在做什么,你可以用与引用其函数相同的符号来触摸模块的全局变量。modname.itemname

此处描述了 global-in-a-module 的具体用法 - 如何在模块之间共享全局变量?,为了完整起见,此处共享内容:

在单个程序中跨模块共享信息的规范方法是创建一个特殊的配置模块(通常称为 configcfg)。只需将配置模块导入应用程序的所有模块中;然后,该模块将作为全局名称提供。由于每个模块只有一个实例,因此对模块对象所做的任何更改都会反映到所有位置。例如:

文件:config.py

x = 0   # Default value of the 'x' configuration setting

文件:mod.py

import config
config.x = 1

文件:main.py

import config
import mod
print config.x

评论

1赞 vladosaurus 1/2/2018
出于某种原因,我不喜欢我可以摆脱它吗?我来了,然后我有了新的价值。出于某种原因,拥有对我来说并不能解决问题。config.xx = lambda: config.xx()a = config.x
6赞 jhylands 12/7/2018
@vladosaurus解决这个问题?from config import x
5155赞 Paul Stephenson 1/8/2009 #2

您可以在其他函数中使用全局变量,方法是将其声明为在为其赋值的每个函数中global

globvar = 0

def set_globvar_to_one():
    global globvar    # Needed to modify global copy of globvar
    globvar = 1

def print_globvar():
    print(globvar)     # No need for global declaration to read value of globvar

set_globvar_to_one()
print_globvar()       # Prints 1

由于不清楚是创建局部变量还是更改全局变量,因此 Python 默认创建局部变量,并让您使用关键字显式选择其他行为。globvar = 1global

如果要跨模块共享全局变量,请参阅其他答案。

评论

1赞 mikb 11/22/2023
我还要指出(因为我最近经常看到它),如果全局对象不是标量(如列表或字典),如果您正在操作对象的成员(例如字典中的项目),则它不需要全局关键字,而不是对象本身: 对于字典 a 和 b, a.update(b) 不会更改 a 的绑定。
0赞 Santiago Ortiz Ceballos 12/6/2023
值得一提的是,它取决于变量的可变性,如果它是不可变的变量(数字、字符串、元组、冻结集),则默认行为是为分配的值分配新的内存空间。但是,如果它是可变的,它应该可以工作。
77赞 J S 1/8/2009 #3

如果要在函数中引用全局变量,可以使用 global 关键字声明哪些变量是全局变量。您不必在所有情况下都使用它(正如此处有人错误地声称的那样) - 如果表达式中引用的名称在定义此函数的函数的局部作用域或作用域中找不到,则会在全局变量中查找它。

但是,如果分配给函数中未声明为全局变量的新变量,则该变量将隐式声明为局部变量,并且它可能会掩盖任何具有相同名称的现有全局变量。

此外,全局变量也很有用,这与一些 OOP 狂热者相反,他们声称不是这样——特别是对于较小的脚本,其中 OOP 是矫枉过正的。

评论

0赞 Paul Uszak 9/23/2019
绝对是再。狂热 分子。大多数 Python 用户使用它来编写脚本并创建小函数来分离出一小段代码。
0赞 mikb 11/22/2023
我不同意。这是结构化编程与非结构化编程,而不是 OOP。Python 遵循 C 语言,只有函数,而全局变量通常意味着副作用。像 x = f(x) 这样的习语,其中 f 返回 x,而不是带有“全局 x”声明的 f(),肯定更干净、更清晰(以及显式而不是隐式)。
903赞 Jeff Shannon 1/8/2009 #4

如果我正确理解您的情况,您看到的是 Python 如何处理本地(函数)和全局(模块)命名空间的结果。

假设你有一个这样的模块:

# sample.py
_my_global = 5

def func1():
    _my_global = 42

def func2():
    print _my_global

func1()
func2()

您可能期望它打印 42,但实际上它打印 5。如前所述,如果将 '' 声明添加到 ,则将打印 42。globalfunc1()func2()

def func1():
    global _my_global 
    _my_global = 42

这里发生的事情是,Python 假设分配给函数中任何位置的任何名称都是该函数的本地名称,除非另有明确说明。如果它只是从名称中读取,并且该名称在本地不存在,它将尝试在任何包含范围(例如模块的全局范围)查找该名称。

因此,当您将 42 分配给名称时,Python 会创建一个局部变量,该变量会隐藏同名的全局变量。该本地超出范围,并在返回时被垃圾回收;同时,除了(未修改的)全局名称外,永远看不到任何其他内容。请注意,这个命名空间决定发生在编译时,而不是在运行时——如果你在赋值之前读取 inside 的值,你会得到一个 ,因为 Python 已经决定它必须是一个局部变量,但它还没有任何与之关联的值。但是通过使用 '' 语句,您可以告诉 Python 它应该在其他地方寻找名称,而不是在本地分配给它。_my_globalfunc1()func2()_my_globalfunc1()UnboundLocalErrorglobal

(我相信这种行为主要源于本地命名空间的优化——如果没有这种行为,每次在函数中分配新名称时,Python 的 VM 都需要执行至少三次名称查找(以确保该名称在模块/内置级别尚不存在),这将显着减慢非常常见的操作。

评论

1赞 watashiSHUN 10/13/2015
您提到命名空间决策发生在编译时,我不认为这是真的。据我所知,python的编译只检查语法错误,不检查名称错误 试试这个例子 def A(): x+=1,如果你不运行它,它不会给出 UnboundLocalError,请验证谢谢
1赞 Vassilis 1/24/2018
通常使用大写字母表示全局变量,例如MyGlobal = 5
5赞 BlackJack 1/26/2018
@watashiSHUN:命名空间决策确实发生在编译时。确定本地名称与在运行时检查本地名称是否在首次使用之前绑定到值不同。x
20赞 BlackJack 1/26/2018
@Vassilis:通常将所有字母大写:。请参阅 Python 代码的样式指南MY_GLOBAL = 5
2赞 streamofstars 3/24/2023
@BlackJack 除非这种情况在 2018 年至 2023 年之间发生变化,否则根据您链接到的 PEP8,常量应该是大写的。在 PEP8 中清楚地描述了全局变量,它们遵循与小写的函数相同的约定。
28赞 Kylotan 1/9/2009 #5

实际上,您并没有将全局变量存储在局部变量中,而只是创建对原始全局引用所引用的同一对象的局部引用。请记住,Python 中几乎所有内容都是引用对象的名称,在通常的操作中不会复制任何内容。

如果您不必显式指定标识符何时引用预定义的全局变量,那么您可能必须显式指定标识符何时是新的局部变量(例如,使用 JavaScript 中的“var”命令)。由于在任何严肃且重要的系统中,局部变量比全局变量更常见,因此 Python 的系统在大多数情况下更有意义。

你可以有一种尝试猜测的语言,如果存在,则使用全局变量,如果不存在,则创建一个局部变量。但是,这将非常容易出错。例如,导入另一个模块可能会无意中引入该名称的全局变量,从而改变程序的行为。

121赞 SingleNegationElimination 7/12/2011 #6

Python 使用简单的启发式方法来决定它应该从哪个范围加载变量,介于局部和全局之间。如果变量名称出现在赋值的左侧,但未声明为全局变量,则假定该变量名称为局部变量。如果它没有出现在赋值的左侧,则假定它是全局的。

>>> import dis
>>> def foo():
...     global bar
...     baz = 5
...     print bar
...     print baz
...     print quux
... 
>>> dis.disassemble(foo.func_code)
  3           0 LOAD_CONST               1 (5)
              3 STORE_FAST               0 (baz)

  4           6 LOAD_GLOBAL              0 (bar)
              9 PRINT_ITEM          
             10 PRINT_NEWLINE       

  5          11 LOAD_FAST                0 (baz)
             14 PRINT_ITEM          
             15 PRINT_NEWLINE       

  6          16 LOAD_GLOBAL              1 (quux)
             19 PRINT_ITEM          
             20 PRINT_NEWLINE       
             21 LOAD_CONST               0 (None)
             24 RETURN_VALUE        
>>> 

了解 中 中赋值左侧的 baz 是如何成为唯一变量的。foo()LOAD_FAST

评论

14赞 Martijn Pieters 8/9/2015
启发式查找绑定操作。赋值就是这样一种操作,导入另一种操作。但是循环的目标和 in 和语句后面的名称也被绑定到。foraswithexcept
0赞 Robert 2/7/2020
@MartijnPieters 对于从句后面的名称,这对我来说并不明显。但它会自动删除以节省内存。asexcept
2赞 Martijn Pieters 2/7/2020
@Robert:不是为了节省内存,而是为了避免创建循环引用,这可能导致内存泄漏。这是因为异常引用了回溯,而回溯引用了整个调用堆栈中的每个本地和全局命名空间,包括异常处理程序中的目标。as ...
43赞 Bohdan 10/3/2013 #7

在并行执行中,如果您不了解正在发生的事情,全局变量可能会导致意外结果。下面是在多处理中使用全局变量的示例。我们可以清楚地看到,每个进程都使用自己的变量副本:

import multiprocessing
import os
import random
import sys
import time

def worker(new_value):
    old_value = get_value()
    set_value(random.randint(1, 99))
    print('pid=[{pid}] '
          'old_value=[{old_value:2}] '
          'new_value=[{new_value:2}] '
          'get_value=[{get_value:2}]'.format(
          pid=str(os.getpid()),
          old_value=old_value,
          new_value=new_value,
          get_value=get_value()))

def get_value():
    global global_variable
    return global_variable

def set_value(new_value):
    global global_variable
    global_variable = new_value

global_variable = -1

print('before set_value(), get_value() = [%s]' % get_value())
set_value(new_value=-2)
print('after  set_value(), get_value() = [%s]' % get_value())

processPool = multiprocessing.Pool(processes=5)
processPool.map(func=worker, iterable=range(15))

输出:

before set_value(), get_value() = [-1]
after  set_value(), get_value() = [-2]
pid=[53970] old_value=[-2] new_value=[ 0] get_value=[23]
pid=[53971] old_value=[-2] new_value=[ 1] get_value=[42]
pid=[53970] old_value=[23] new_value=[ 4] get_value=[50]
pid=[53970] old_value=[50] new_value=[ 6] get_value=[14]
pid=[53971] old_value=[42] new_value=[ 5] get_value=[31]
pid=[53972] old_value=[-2] new_value=[ 2] get_value=[44]
pid=[53973] old_value=[-2] new_value=[ 3] get_value=[94]
pid=[53970] old_value=[14] new_value=[ 7] get_value=[21]
pid=[53971] old_value=[31] new_value=[ 8] get_value=[34]
pid=[53972] old_value=[44] new_value=[ 9] get_value=[59]
pid=[53973] old_value=[94] new_value=[10] get_value=[87]
pid=[53970] old_value=[21] new_value=[11] get_value=[21]
pid=[53971] old_value=[34] new_value=[12] get_value=[82]
pid=[53972] old_value=[59] new_value=[13] get_value=[ 4]
pid=[53973] old_value=[87] new_value=[14] get_value=[70]
37赞 user2876408 10/14/2013 #8

事实证明,答案总是很简单的。

下面是一个小型示例模块,其中包含在定义中显示它的简单方法:main

def five(enterAnumber,sumation):
    global helper
    helper  = enterAnumber + sumation

def isTheNumber():
    return helper

以下是如何在定义中显示它:main

import TestPy

def main():
    atest  = TestPy
    atest.five(5,8)
    print(atest.isTheNumber())

if __name__ == '__main__':
    main()

这个简单的代码就是这样工作的,它将执行。我希望它有所帮助。

评论

1赞 barlop 10/20/2013
谢谢,我是 Python 的新手,但对 Java 有所了解。你说的对我有用。并在类中编写全局 a<ENTER>。对我来说,似乎比在编写“全局 a”的函数中更有意义。我注意到你不能说全局 a=4
2赞 swdev 9/18/2014
这对我来说可能是最简单但非常有用的 python 技巧。我将此模块命名为 ,并初始化在启动脚本中调用的数据。然后,我只需为每个定义的全局变量创建访问器方法。我希望我能多次投赞成票!谢谢彼得!global_varsinit_global_vars
1赞 jtlz2 4/10/2015
如果有很多很多全局变量,而我不想在全局语句之后逐个列出它们怎么办?
60赞 Rauni Lillemets 7/4/2014 #9

除了已经存在的答案之外,为了使这更加令人困惑:

在 Python 中,仅在函数内部引用的变量是隐式全局的。如果在任意位置为变量分配了新值 在函数的主体中,它被假定为局部函数。如果变量 在函数中分配一个新值,变量是 隐式本地,您需要将其显式声明为“全局”。

虽然一开始有点惊讶,但稍加考虑就可以解释 这。一方面,要求对赋值变量进行全局设置可提供 防止意外的副作用。另一方面,如果全球是 对于所有全局引用都是必需的,您将使用全局所有 时间。您必须将对内置的每个引用声明为全局 函数或导入模块的组件。这种混乱会 破坏《全球宣言》在识别方面的作用 副作用。

来源:Python 中局部变量和全局变量的规则是什么?.

34赞 gxyd 12/4/2014 #10

你要说的是使用这样的方法:

globvar = 5

def f():
    var = globvar
    print(var)

f()  # Prints 5

但更好的方法是像这样使用全局变量:

globvar = 5
def f():
    global globvar
    print(globvar)
f()   #prints 5

两者都提供相同的输出。

31赞 Mohamed El-Saka 12/20/2014 #11

您需要在要使用的每个函数中引用全局变量。

如下:

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]
"""

评论

4赞 spazm 3/20/2015
“在你想使用的每个函数中”是微妙的不正确的,应该更接近于:“在你要更新的每个函数中'
31赞 Sagar Mehta 2/5/2015 #12

试试这个:

def x1():
    global x
    x += 1
    print('x1: ', x)

def x2():
    global x
    x = x+1
    print('x2: ', x)

x = 5
print('x:  ', x)
x1()
x2()

# Output:
# x:   5
# x1:  6
# x2:  7

评论

0赞 not2qubit 11/28/2020
祝贺!终于有人得到了最重要的使用点.即在函数本身之后定义的函数中使用变量。global
21赞 user5473311 10/24/2015 #13

接下来,作为附加组件,使用一个文件来包含所有在本地声明的全局变量,然后:import as

文件 initval.py

Stocksin = 300
Prices = []

文件 getstocks.py

import initval as iv

def getmystocks(): 
    iv.Stocksin = getstockcount()


def getmycharts():
    for ic in range(iv.Stocksin):

评论

1赞 oHo 5/24/2017
将全局变量移动到另一个文件有什么好处?只是将全局变量组合到一个小文件中吗?为什么要使用这个语句?为什么不只是 ?import ... as ...import ...
1赞 oHo 5/24/2017
啊。。。我终于明白了优点:无需使用关键字:-) => +1 :-)请编辑您的回答,以澄清其他人可能也有的这些询问。干杯global
0赞 taiyodayo 9/2/2022
我发现这种方法非常通用且易于管理。我有很多变量 (50+),我想为许多单独的模块文件提供这些变量。
71赞 Russia Must Remove Putin 1/2/2016 #14

如果我在一个函数中创建全局变量,如何在另一个函数中使用该变量?

我们可以使用以下函数创建一个全局变量:

def create_global_variable():
    global global_variable # must declare it to be a global first
    # modifications are thus reflected on the module's global scope
    global_variable = 'Foo' 

编写函数实际上并不运行其代码。因此,我们调用该函数:create_global_variable

>>> create_global_variable()

在不修改的情况下使用全局变量

你可以只使用它,只要你不希望改变它指向的对象:

例如

def use_global_variable():
    return global_variable + '!!!'

现在我们可以使用全局变量:

>>> use_global_variable()
'Foo!!!'

从函数内部修改全局变量

若要将全局变量指向其他对象,需要再次使用 global 关键字:

def change_global_variable():
    global global_variable
    global_variable = 'Bar'

请注意,在编写此函数后,实际更改它的代码仍未运行:

>>> use_global_variable()
'Foo!!!'

所以调用函数后:

>>> change_global_variable()

我们可以看到全局变量已经改变。该名称现在指向:global_variable'Bar'

>>> use_global_variable()
'Bar!!!'

请注意,Python 中的“global”并不是真正的全局 - 它只是模块级别的全局。因此,它仅适用于在全局模块中编写的函数。函数会记住编写它们的模块,因此当它们导出到其他模块时,它们仍会在创建它们的模块中查找全局变量。

同名局部变量

如果创建同名的局部变量,它将覆盖全局变量:

def use_local_with_same_name_as_global():
    # bad name for a local variable, though.
    global_variable = 'Baz' 
    return global_variable + '!!!'

>>> use_local_with_same_name_as_global()
'Baz!!!'

但是使用这个命名错误的局部变量不会改变全局变量:

>>> use_global_variable()
'Bar!!!'

请注意,您应该避免使用与全局变量同名的局部变量,除非您确切地知道自己在做什么并且有充分的理由这样做。我还没有遇到过这样的原因。

我们在课堂上得到相同的行为

后续评论问:

如果我想在类内的一个函数内创建一个全局变量,并想在另一个类内的另一个函数中使用该变量,该怎么办?

在这里,我演示了我们在方法中获得与常规函数相同的行为:

class Foo:
    def foo(self):
        global global_variable
        global_variable = 'Foo'

class Bar:
    def bar(self):
        return global_variable + '!!!'

Foo().foo()

现在:

>>> Bar().bar()
'Foo!!!'

但我建议不要使用全局变量,而是使用类属性,以避免使模块命名空间混乱。另请注意,我们在这里不使用参数 - 这些可能是类方法(如果从通常的参数中改变类属性,则很方便)或静态方法(no 或 )。selfclsselfcls

评论

0赞 fpaekoaij 1/19/2020
很酷,但是如果我想在类内的一个函数中创建一个全局变量,并想在另一个类内的另一个函数中使用该变量,该怎么办?有点卡在这里
3赞 Russia Must Remove Putin 1/19/2020
@anonmanx我不知道你为什么卡住了,方法中的行为与常规函数中的行为相同。但我会用你的评论和一些演示代码来更新我的答案,好吗?
0赞 fpaekoaij 1/19/2020
好的,知道了。因此,我必须显式调用该函数才能使用该全局变量。
17赞 Mike Lampton 1/8/2016 #15

写入全局数组的显式元素显然不需要全局声明,尽管“批发”写入它确实有这个要求:

import numpy as np

hostValue = 3.14159
hostArray = np.array([2., 3.])
hostMatrix = np.array([[1.0, 0.0],[ 0.0, 1.0]])

def func1():
    global hostValue    # mandatory, else local.
    hostValue = 2.0

def func2():
    global hostValue    # mandatory, else UnboundLocalError.
    hostValue += 1.0

def func3():
    global hostArray    # mandatory, else local.
    hostArray = np.array([14., 15.])

def func4():            # no need for globals
    hostArray[0] = 123.4

def func5():            # no need for globals
    hostArray[1] += 1.0

def func6():            # no need for globals
    hostMatrix[1][1] = 12.

def func7():            # no need for globals
    hostMatrix[0][0] += 0.33

func1()
print "After func1(), hostValue = ", hostValue
func2()
print "After func2(), hostValue = ", hostValue
func3()
print "After func3(), hostArray = ", hostArray
func4()
print "After func4(), hostArray = ", hostArray
func5()
print "After func5(), hostArray = ", hostArray
func6()
print "After func6(), hostMatrix = \n", hostMatrix
func7()
print "After func7(), hostMatrix = \n", hostMatrix
24赞 Martin Thoma 4/8/2017 #16

如果您有一个同名的局部变量,您可能需要使用 globals() 函数

globals()['your_global_var'] = 42
8赞 llewellyn falco 8/19/2017 #17

引用要显示更改的类命名空间。

在此示例中,runner 使用文件配置中的 max。我希望我的测试在运行器使用它时更改 max 的值。

main/config.py

max = 15000

main/runner.py

from main import config
def check_threads():
    return max < thread_count 

测试/runner_test.py

from main import runner                # <----- 1. add file
from main.runner import check_threads
class RunnerTest(unittest):
   def test_threads(self):
       runner.max = 0                  # <----- 2. set global 
       check_threads()
9赞 Rafaël Dera 9/5/2017 #18

我之所以添加这个,是因为我没有在任何其他答案中看到它,它可能对那些在类似事情上苦苦挣扎的人有用。globals() 函数返回一个可变的全局符号字典,您可以在其中“神奇地”使数据可用于代码的其余部分。 例如:

from pickle import load
def loaditem(name):
    with open(r"C:\pickle\file\location"+"\{}.dat".format(name), "rb") as openfile:
        globals()[name] = load(openfile)
    return True

from pickle import dump
def dumpfile(name):
    with open(name+".dat", "wb") as outfile:
        dump(globals()[name], outfile)
    return True

只是让你将变量转储/加载到全局命名空间中。超级方便,没有麻烦,没有大惊小怪。可以肯定的是,它只是 Python 3。

评论

3赞 Kiran Jonnalagadda 5/8/2019
globals()始终返回本地上下文中可用的全局变量,因此此处的突变可能不会反映在另一个模块中。
8赞 thomas 5/25/2020 #19

全局变量很好 - 多处理除外

与不同平台/环境上的多处理相关的全局变量 因为一边是 Windows/Mac OS,另一边是 Linux,很麻烦。

我将用一个简单的例子向你展示这一点,指出我前段时间遇到的一个问题。

如果您想了解,为什么 Windows/MacOS 和 Linux 上的情况有所不同,那么 需要知道的是,在...

  • Windows/MacOs 是“生成”
  • Linux 是“分叉”

它们在内存分配和初始化方面有所不同......(但我不深入探讨 这里)。

让我们看一下问题/示例......

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
7赞 Mohsen Haddadi 8/28/2020 #20

有 2 种方法可以将变量声明为全局变量:

1. 在函数内部分配变量并使用全局线

def declare_a_global_variable():
    global global_variable_1
    global_variable_1 = 1

# Note to use the function to global variables
declare_a_global_variable() 

2. 分配变量外部函数:

global_variable_2 = 2

现在我们可以在其他函数中使用这些声明的全局变量:

def declare_a_global_variable():
    global global_variable_1
    global_variable_1 = 1

# Note to use the function to global variables
declare_a_global_variable() 
global_variable_2 = 2

def print_variables():
    print(global_variable_1)
    print(global_variable_2)
print_variables() # prints 1 & 2

注1:

如果要更改另一个函数中的全局变量,例如在分配变量之前,应在该函数中使用全局行:update_variables()

global_variable_1 = 1
global_variable_2 = 2

def update_variables():
    global global_variable_1
    global_variable_1 = 11
    global_variable_2 = 12 # will update just locally for this function

update_variables()
print(global_variable_1) # prints 11
print(global_variable_2) # prints 2

注2:

注释 1 对于列表和字典变量有一个例外,而在函数中不使用全局行:

# declaring some global variables
variable = 'peter'
list_variable_1 = ['a','b']
list_variable_2 = ['c','d']

def update_global_variables():
    """without using global line"""
    variable = 'PETER' # won't update in global scope
    list_variable_1 = ['A','B'] # won't update in global scope
    list_variable_2[0] = 'C' # updated in global scope surprisingly this way
    list_variable_2[1] = 'D' # updated in global scope surprisingly this way

update_global_variables()

print('variable is: %s'%variable) # prints peter
print('list_variable_1 is: %s'%list_variable_1) # prints ['a', 'b']
print('list_variable_2 is: %s'%list_variable_2) # prints ['C', 'D']
5赞 Pavn 5/1/2021 #21

虽然这个问题已经得到解答,但我再次给出解决方案,因为我更喜欢单行 如果您希望在函数中创建全局变量,这是

def someFunc():
    x=20
    globals()['y']=50
someFunc() # invoking function so that variable Y is created globally 
print(y) # output 50
print(x) #NameError: name 'x' is not defined as x was defined locally within function
1赞 Oscar Nguyen 2/11/2022 #22

像这样的代码:

myVar = 12

def myFunc():
  myVar += 12

钥匙:

如果在字符串外部声明变量,则该变量将变为全局变量。

如果在字符串中声明一个变量,则该变量将变为局部变量。

如果要在字符串中声明全局变量,请在要声明的变量之前使用关键字:global

myVar = 124
def myFunc():
  global myVar2
  myVar2 = 100
myFunc()
print(myVar2)

然后文档中有 100 个。

9赞 SHIVAM SINGH 3/29/2022 #23
global_var = 10  # will be considered as a global variable


def func_1():
    global global_var  # access variable using variable keyword
    global_var += 1


def func_2():
    global global_var
    global_var *= 2
    print(f"func_2: {global_var}")


func_1()
func_2()
print("Global scope:", global_var) # will print 22

解释:

global_var是一个全局变量,所有函数和类都可以访问该变量。

使用指向在全局范围内写入的变量的关键字访问该全局变量。如果我没有编写全局关键字,则内部变量将被视为仅在函数内部可用的局部变量。然后在里面,我将该全局变量递增了 1。func_1()globalglobal_varfunc_1func_1

同样的情况也发生在 .func_2()

调用 和 后,您会看到 已更改func_1func_2global_var

评论

0赞 SHIVAM SINGH 4/4/2022
global_var是一个全局变量,所有函数和类都可以访问该变量。func_1() 使用关键字访问该全局变量,这意味着指向在全局范围内写入的变量。如果我没有写关键字,里面的变量就被认为是一个局部变量,只能在函数内部使用。然后在里面,我将该全局变量递增了 1。同样的情况也发生在 func_2() 中。调用 func_1 并func_2后,您会看到 已更改。globalglobalglobal_varfunc_1func_1global_var
0赞 zeeshan12396 4/15/2022 #24
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 that 0,所以虽然循环条件为 true

     Initialize()

函数将被调用。循环将是无限的

#if we do Initialized=1 then loop will terminate  

else:
    print("Lets do something else now!")
-5赞 zaldi 1 12/1/2022 #25

如果你想访问全局变量,你只需在函数中添加全局关键字 前任: global_var = '是'

def someFunc():
   global global_var;
   print(nam_of_var)

评论

0赞 tricknology 12/5/2022
答案不完整,请添加一个功能示例。