Python 函数全局变量?[重复]
- 2024-12-06 08:40:00
- admin 原创
- 85
问题描述:
我知道我应该首先避免使用全局变量,因为这样会造成混淆,但是如果我要使用它们,以下是使用它们的有效方法吗?(我正在尝试调用在单独的函数中创建的变量的全局副本。)
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
当您希望改变分配给全局变量的值时,必须使用声明。
您不需要它来读取全局变量。请注意,调用对象上的方法(即使它会改变该对象内的数据)不会改变保存该对象的变量的值(没有反射魔法)。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理必备:盘点2024年13款好用的项目管理软件