python中的全局变量

时间:2014-04-30 11:23:42

标签: python global

我对python中的全局变量有疑问。 如果我正确地得到了这个,我可以从这个类中的每个方法中读取我在类中定义的所有变量。 现在我认为如果我用全局' variableName'标记它们,我只能写入全局变量。之前。但这就是让我感到害怕的事情:

def foo(a):
    for i in range(a[0].__len__()):
        a[0][i] -= a[1][i]
a = [[0,1,2,3,4,5,6],[0,1,2,3,4,5,6]]
foo(a)
print(a)

给了我

[[0, 0, 0, 0, 0, 0, 0], [0, 1, 2, 3, 4, 5, 6]]

但是为什么?我的意思是,我从不贬低全球性的'。

奇怪的是,如果我这样做:

def foo(a):
    a -= 1
a = 2
foo(a)
print(a)

为什么这会给我

2

我不明白其中的区别:/

2 个答案:

答案 0 :(得分:4)

您的功能定义存在问题。您正在将两个函数作为参数传递,因此无需首先声明任何全局函数。如果您要从定义中删除参数,这个问题会更有意义。

这里的整个混乱在于python中数据类型的可变性。列表和词典是可变容器,这意味着它们的值可以随时更改。其他数据类型,如整数,浮点数,元组等是不可变的。你无法改变它们。您可以创建新的,1 + 1将返回一个新的整数2

在第一个示例中,您正在修改列表的内容。列表是可变容器,这意味着它们的内容可以改变。如果您在全局范围内碰巧有a,那么同一范围内的函数可以修改列表的内容。

def foo():
    """ Notice i've removed the argument `a` from the function def, to illustrate my point.. """
    for i in range(a[0].__len__()):
        a[0][i] -= a[1][i]
>>> a = [[0,1,2,3,4,5,6],[0,1,2,3,4,5,6]]
>>> foo()
>>> print(a)
[[0, 0, 0, 0, 0, 0, 0], [0, 1, 2, 3, 4, 5, 6]]

在第二个示例中,您正在修改整数。整数是不可变数据类型,无法修改。以下修改函数a的局部作用域中的变量foo()(通过创建新整数),但因为您尚未定义a全局或返回本地a,没有明显的变化。

def foo(a):
    a -= 1
>>> a = 2
>>> foo(a)
>>> print(a)
2

答案 1 :(得分:3)

TL; DR global与可变性无关。

您将列表作为参数a传递给函数。列表是可变的,因此该函数可以更改它。论证和全局都被称为a这一事实并不重要:

def foo(some_list):
    some_list.append('foo!')

global_list = []

foo(global_list)
print(global_list)
即使['foo!']未直接引用foo

也会打印global_list。您的代码也会发生同样的情况。

现在更重要的是。修改全局:

def bar():
    global_list.append('bar.')

还会修改global_list,因为当它查找符号"global_list"时,它会在模块(“全局”)范围内找到它。您需要global关键字的唯一情况是您要重新绑定名称 global_list,因为在

def reset():
    global_list = []

赋值隐式创建局部变量global_list,因此应该写

def reset():
    global global_list
    global_list = []