0

在同一脚本中给出以下内容:

class ClassA:
    def GetExpBidBrice():
        global x
        x ='abc'

    def GetExpAskPrice():
        y = x + 'zyz'

class ClassB:
    def GetExpBidBrice():
        x = 123

    def GetExpAskPrice():
        y = x + 'zyz'

in是否只对inglobal的其他方法全局化?或者它是否使它成为全局的,即在或任何其他使用变量的类中?ClassA.GetExpBidPrice()xClassAClassBx

4

5 回答 5

3

该变量仅在当前代码块中成为全局变量。从global声明文档中

global语句是适用于整个当前代码块的声明。这意味着列出的标识符将被解释为全局变量。没有全局变量就不可能分配给全局变量,尽管自由变量可以引用全局变量而不被声明为全局变量。

其他方法中的变量x不受影响。它只会是ClassA.GetExpBidBrice()方法中的全局变量。

如果您希望它在其他方法中也是全局的(和) ClassA.GetExpAskPrice(),那么您需要在每个方法中分别声明一个全局。ClassB.GetExpBidBrice()ClassB.GetExpAskPrice()x

于 2012-11-07T12:14:35.140 回答
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'的局部变量,它不会影响全局。

于 2012-11-07T13:20:24.080 回答
0

函数内部使用的全局关键字将在该功能块中有效。global 将帮助您从函数内进行更改/更新全局变量。

于 2012-11-07T12:19:23.470 回答
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
于 2012-11-07T13:10:08.253 回答
0

在给定函数中使用关键字将在该函数范围内global对该变量的任何使用标记为引用具有该名称的模块级全局变量。

在您的示例中,只有一个global声明的方法对在其他方法中使用相同名称没有影响。

于 2012-11-07T12:15:37.413 回答