我有一个关于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我不明白其中的区别
发布于 2014-04-30 11:27:03
函数定义有问题。您正在传递这两个函数一个参数,因此不必首先声明任何全局的内容。如果您从定义中删除这些参数,这个问题就会更有意义。
这里的混乱之处在于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发布于 2014-04-30 11:26:50
global博士并不是关于易变性的。
您要将一个列表作为参数a传递给函数。列表是可变的,因此函数可以更改它。争论和全局都被称为a这一事实并不重要:
def foo(some_list):
some_list.append('foo!')
global_list = []
foo(global_list)
print(global_list)打印['foo!'],即使foo不直接引用global_list。同样的情况也发生在您的代码中。
现在更重要的是,wrt。修改全球:
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 = []https://stackoverflow.com/questions/23386816
复制相似问题