在同一个脚本中给出以下内容:
class ClassA:
def GetExpBidBrice():
global x
x ='abc'
def GetExpAskPrice():
y = x + 'zyz'
class ClassB:
def GetExpBidBrice():
x = 123
def GetExpAskPrice():
y = x + 'zyz'
global
中的ClassA.GetExpBidPrice()
是否x
只对ClassA
中的另一种方法做出了全局ClassB
?或者它是否全面适用于全局,即x
或使用名为{{1}}的变量的任何其他类?
答案 0 :(得分:3)
变量仅在当前代码块中变为全局变量。来自global
statement documentation:
global
语句是一个声明,它包含整个当前代码块。这意味着列出的标识符将被解释为全局变量。没有全局变量就不可能分配给全局变量,尽管自由变量可以引用全局变量而不被声明为全局变量。
其他方法中的变量x
不受影响。它只是ClassA.GetExpBidBrice()
方法中的全局。
如果您希望它在其他方法中也是全局的(ClassA.GetExpAskPrice()
,ClassB.GetExpBidBrice()
和ClassB.GetExpAskPrice()
),那么您需要声明x
全局在每种方法中分开。
答案 1 :(得分:0)
在给定函数中使用global
关键字标记在该函数的范围中使用变量作为引用具有该名称的模块级全局变量。
在您的示例中,使用只 global
声明的方法对在其他方法中使用相同名称没有影响。
答案 2 :(得分:0)
全局关键字在该功能块中有效。 global将帮助您在函数内进行更改/更新全局变量。
答案 3 :(得分:0)
我说“贯穿整个剧本”。 这意味着在没有标识的命名空间中,就在>>>之后
>>> def g():
def f():
global x
print x
return f
>>> f = g()
>>> f.func_globals is g.func_globals
True
>>> f.func_globals is globals()
True
>>> x = 3
>>> f()
3
第二个例子告诉你:它始终是模块/脚本命名空间
>>> x = 3
>>> def g():
x = 0
def f():
global x
print x
x += 1
return f
>>> f = g()
>>> f() # would be 0 if x of g was used.
3
>>> f()
4
答案 4 :(得分:0)
这取决于。
执行赋值的方法将创建局部变量,除非它们在同一方法中使用global
关键字声明。
仅读取变量的方法将尝试按该名称读取全局。例如:
class ClassA:
def GetExpBidBrice(self):
global x
x ='abc'
class ClassB:
def GetExpAskPrice(self):
print(x)
a = ClassA()
b = ClassB()
a.GetExpBidBrice()
b.GetExpAskPrice()
将显示abc
。
但是:如果省略第一个方法调用,只需执行:
b = ClassB()
b.GetExpAskPrice()
你得到:
NameError: global name 'x' is not defined
现在,如果我们改为:
def GetExpAskPrice(self):
x = 'xyz'
print(x)
这个赋值是一个名为'x'的局部变量,它不会影响全局。