列表是隐含的全球性的吗?功能内部?

时间:2016-08-18 16:36:33

标签: python python-2.7 global-variables

我正在尝试使用此代码:

def a():
    #global p
    p.append(4);
    d=9

p=[2,3];
d=8
a();
print p  # ----> [2, 3, 4]
print d  # ----> 8

变量d值未更改,因为我没有使用global关键字。但即使我没有使用p,列表global也会在功能中进行修改。默认情况下,所有列表global都在函数中吗?

1 个答案:

答案 0 :(得分:1)

关键区别在于此处的分配。您可以在现有全局对象上调用方法,但无法在不调用global的情况下分配给它们。在您的代码中,名称d正在重新分配以引用另一个值。如果您更改p并执行了作业,那么您将获得类似的结果

def a():
    p = [5, 7]  # new local variable, doesn't change global
    p.append(9)  # doesn't change global p

如果你想一想python第一次遇到这个名字会发生什么,这是有道理的。在您提供的功能中,python会看到p.append并说出"嗯,我没有名字p的本地人,让我看一下封闭的内容。范围"它会看到全局p并使用它。

在我已经展示的示例中,python会说"没有明确的global所以我认为这应该是一个新的局部变量。"并创建一个。

python中的名称只是引用。如果python遵循你期望的行为,你需要为你调用的每个函数global,请让我解释一下:

def a():
    p.append(1)  # I should need 'global p' to do this

这意味着如果你有

def g():
    ...

def f():
    g()  # this would also need 'global g', otherwise how does it see g?

def f2():
    global g
    def g():  # changes the global g function
        return 0