为什么对象不需要全局关键字

时间:2018-11-20 14:19:47

标签: python global-variables global

在此示例中,我需要包括global关键字。我在堆栈交换的其他地方已经读到,不可变对象需要global关键字。

def foo(param):
    global message
    message += param

message = " hello "

foo("world")

print(message)

,但在此示例中,使用易变的列表,我 也需要全局关键字。

def foo(param):
    global message
    message += [ param ]

message = [ "hello" ]

foo("world")

print(message)

但是在此示例中,我创建了一个“容器”对象,该对象使我可以不用全局关键字。

class container:

    def __init__(self):
        self._message = ""

    def __str__(self):
        return self._message

    def add(self, param):
        self._message += param

def foo(param):
    message.add(param)

message = container()
message.add(" hello ")

foo("world")

print(message)

使用global关键字的规则是什么?这似乎不一致

1 个答案:

答案 0 :(得分:0)

frequently asked question在官方文档中有一个答案:

  

在Python中,仅在函数内部引用的变量是隐式全局的。如果在函数体内任何位置为变量分配了值,除非明确声明为全局变量,否则假定该变量为局部变量。

     

尽管起初有些令人惊讶,但片刻的考虑解释了这一点。一方面,要求全局分配变量可防止意外副作用。另一方面,如果所有全局引用都需要全局,那么您将一直使用全局。您必须将对内置函数或导入模块的组件的所有引用声明为全局引用。这种混乱将破坏全球宣言对确定副作用的有用性。

有关更多详细信息,请参见documentation on global