我对 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]]
但是为什么?我的意思是,我从未声明过“全局 a”。
奇怪的是,如果我这样做:
def foo(a):
a -= 1
a = 2
foo(a)
print(a)
为什么会这样
2
我不明白其中的区别:/
请您参考如下方法:
您的函数定义有问题。您正在向两个函数传递一个参数,因此无需首先声明任何全局内容。如果您要从定义中删除参数,这个问题会更有意义一些。
这里的全部混淆在于 python 中数据类型的可变性。列表和字典是可变容器,这意味着它们的值可以随时更改。其他数据类型,如整数、 float 、元组等是不可变的。你无法改变它们。您可以创建新的,例如 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]]
在您的第二个示例中,您正在修改一个整数。整数是不可变的数据类型,不能修改。以下将在函数foo() 的局部范围内修改变量a(通过创建一个新的整数)但是因为您还没有定义a 全局或返回局部a,没有可见的变化。
def foo(a):
a -= 1
>>> a = 2
>>> foo(a)
>>> print(a)
2
