Python 函数全局变量?[重复]

2024-12-06 08:40:00
admin
原创
146
摘要:问题描述:我知道我应该首先避免使用全局变量,因为这样会造成混淆,但是如果我要使用它们,以下是使用它们的有效方法吗?(我正在尝试调用在单独的函数中创建的变量的全局副本。)x = "somevalue" def func_A (): global x # Do things to...

问题描述:

我知道我应该首先避免使用全局变量,因为这样会造成混淆,但是如果我要使用它们,以下是使用它们的有效方法吗?(我正在尝试调用在单独的函数中创建的变量的全局副本。)

x = "somevalue"

def func_A ():
   global x
   # Do things to x
   return x

def func_B():
   x = func_A()
   # Do things
   return x

func_A()
func_B()

第二个函数使用的是否与使用并修改的的x全局副本具有相同的值?在定义后调用函数时,顺序是否重要?x`func_a`


解决方案 1:

如果您只想访问全局变量,只需使用它的名称即可。但是要更改其值,您需要使用global关键字。

例如

global someVar
someVar = 55

这会将全局变量的值更改为 55。否则它只会将 55 分配给局部变量。

函数定义列表的顺序并不重要(假设它们不以某种方式互相引用),重要的是它们被调用的顺序。

解决方案 2:

在 Python 作用域内,对尚未在该作用域内声明的变量的任何赋值都会创建一个新的局部变量,除非该变量在函数中先前声明为使用关键字引用全局作用域变量global

让我们看一下伪代码的修改版本,看看会发生什么:

# Here, we're creating a variable 'x', in the __main__ scope.
x = 'None!'

def func_A():
  # The below declaration lets the function know that we
  #  mean the global 'x' when we refer to that variable, not
  #  any local one

  global x
  x = 'A'
  return x

def func_B():
  # Here, we are somewhat mislead.  We're actually involving two different
  #  variables named 'x'.  One is local to func_B, the other is global.

  # By calling func_A(), we do two things: we're reassigning the value
  #  of the GLOBAL x as part of func_A, and then taking that same value
  #  since it's returned by func_A, and assigning it to a LOCAL variable
  #  named 'x'.     
  x = func_A() # look at this as: x_local = func_A()

  # Here, we're assigning the value of 'B' to the LOCAL x.
  x = 'B' # look at this as: x_local = 'B'

  return x # look at this as: return x_local

事实上,您可以func_B用命名的变量重写所有内容x_local,并且它将以相同的方式工作。

顺序只与函数执行改变全局 x 值的操作的顺序有关。因此,在我们的示例中,顺序并不重要,因为func_B调用了func_A。在此示例中,顺序很重要:

def a():
  global foo
  foo = 'A'

def b():
  global foo
  foo = 'B'

b()
a()
print foo
# prints 'A' because a() was the last function to modify 'foo'.

请注意,global只需要修改全局对象即可。您仍然可以在函数内部访问它们,而无需声明global。因此,我们有:

x = 5

def access_only():
  return x
  # This returns whatever the global value of 'x' is

def modify():
  global x
  x = 'modified'
  return x
  # This function makes the global 'x' equal to 'modified', and then returns that value

def create_locally():
  x = 'local!'
  return x
  # This function creates a new local variable named 'x', and sets it as 'local',
  #  and returns that.  The global 'x' is untouched.

create_locally请注意和之间的区别access_only——access_only尽管没有调用,但仍访问全局 x global,尽管两者create_locally都不使用global,但它会创建一个本地副本,因为它正在分配一个值。

这里的令人困惑的是为什么不应该使用全局变量。

解决方案 3:

您可以直接访问函数内的全局变量。如果要更改该全局变量的值,请使用“global variable_name”。请参阅以下示例:

var = 1
def global_var_change():
      global var
      var = "value changed"
global_var_change() #call the function for changes
print var

一般来说,这不是一个好的编程习惯。通过破坏命名空间逻辑,代码会变得难以理解和调试。

解决方案 4:

global正如其他人所指出的,当你希望函数能够修改全局变量时,你需要在函数中声明一个变量。如果你只想访问它,那么你不需要global

更详细地说,“修改”的含义是:如果您想重新绑定全局名称以使其指向不同的对象,则必须global在函数中声明该名称。

许多修改(变异)对象的操作不会重新绑定全局名称以指向不同的对象,因此它们都是有效的,global而无需在函数中声明名称。

d = {}
l = []
o = type("object", (object,), {})()

def valid():     # these are all valid without declaring any names global!
   d[0] = 1      # changes what's in d, but d still points to the same object
   d[0] += 1     # ditto
   d.clear()     # ditto! d is now empty but it`s still the same object!
   l.append(0)   # l is still the same list but has an additional member
   o.test = 1    # creating new attribute on o, but o is still the same object

解决方案 5:

这是一个让我感到困惑的案例,使用全局变量作为参数的默认值。

globVar = None    # initialize value of global variable

def func(param = globVar):   # use globVar as default value for param
    print 'param =', param, 'globVar =', globVar  # display values

def test():
    global globVar
    globVar = 42  # change value of global
    func()

test()
=========
output: param = None, globVar = 42

我原本以为 param 的值为 42。出乎意料。Python 2.7 在首次解析函数 func 时评估了 globVar 的值。更改 globVar 的值不会影响分配给 param 的默认值。延迟评估(如下所示)如我所需。

def func(param = eval('globVar')):       # this seems to work
    print 'param =', param, 'globVar =', globVar  # display values

或者,如果你想要安全的话,

def func(param = None)):
    if param == None:
        param = globVar
    print 'param =', param, 'globVar =', globVar  # display values

解决方案 6:

global当您希望改变分配给全局变量的值时,必须使用声明。

您不需要它来读取全局变量。请注意,调用对象上的方法(即使它会改变该对象内的数据)不会改变保存该对象的变量的值(没有反射魔法)。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用