在此示例中,我需要包括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关键字的规则是什么?这似乎不一致
答案 0 :(得分:0)
此frequently asked question在官方文档中有一个答案:
在Python中,仅在函数内部引用的变量是隐式全局的。如果在函数体内任何位置为变量分配了值,除非明确声明为全局变量,否则假定该变量为局部变量。
尽管起初有些令人惊讶,但片刻的考虑解释了这一点。一方面,要求全局分配变量可防止意外副作用。另一方面,如果所有全局引用都需要全局,那么您将一直使用全局。您必须将对内置函数或导入模块的组件的所有引用声明为全局引用。这种混乱将破坏全球宣言对确定副作用的有用性。
有关更多详细信息,请参见documentation on global
。