为什么清空列表并在函数中追加列表会给出空列表?



这段代码在 print 语句中给出了空列表:

X = []
Y = []
Z = []

def DoStuff(a,b,c):
X = []
Y = []
Z = []
X.append(a)
Y.append(b)
Z.append(c)
DoStuff(1,2,3)
print('X:{0}nY:{1}nZ:{2}'.format(X,Y,Z))

我知道我可以通过添加返回语句来"修复":

X = []
Y = []
Z = []

def DoStuff(a,b,c):
X = []
Y = []
Z = []
X.append(a)
Y.append(b)
Z.append(c)
return X, Y, Z
X, Y, Z = DoStuff(1,2,3)
print('X:{0}nY:{1}nZ:{2}'.format(X,Y,Z))

但是为什么第一个代码给出空列表?

因为您要在代码开头定义列表。此外,只有第二个代码将值重新分配给列表

在第一个示例中,要追加的 X、Y、Z 变量的作用域仅限于 DoStuff 函数。

基本上,这里有两种类型的变量:函数内部和函数外部。在第二个示例中,您将返回 InsideX、InsideY、InsideZ 的值,然后用以下行覆盖 OutsideX、OutsideY 和 OutsideZ:

X, Y, Z = DoStuff(1,2,3)

这是因为它们是局部变量。这意味着它们的寿命位于功能块的开始和结束之间。即使它们与全局变量具有相同的名称,当全局变量在块内时,它们也会"隐藏"全局变量。

所以实际上你并没有"清空"列表。如果要修改功能块中的全局变量,可以将它们声明为块内的global foo变量。但是,社区非常不鼓励这种做法。

最新更新