我对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
我不明白其中的区别:/
答案 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 = []