1

这里有两种方法。一个修改变量 x,另一个不修改。你能解释一下这是为什么吗?

x = [1,2,3,4]
def switch(a,b,x):
     x[a], x[b] = x[b], x[a]
switch(0,1,x)
print(x)
[2,1,3,4]


def swatch(x):
    x = [0,0,0,0]

swatch(x)
print(x)
[2,1,3,4]
4

1 回答 1

3

函数定义

def swatch(x):

定义x局部变量。

x = [0, 0, 0, 0]

将局部变量重新分配x给新列表。这不会影响x同名的全局变量。


您可以x从以下参数中删除swatch

def swatch():
    x = [0, 0, 0, 0]

但是当 Python 在函数定义中遇到赋值时,例如

x = [0, 0, 0, 0]

Python 默认会考虑x一个局部变量。为其赋值x不会影响全局变量x.

要告诉 Python 你希望x成为全局变量,你需要使用global声明:

def swatch():
    global x
    x = [0,0,0,0]
swatch()

但是,在这种情况下,由于xmutable,您可以这样定义swatch

def swatch(x):
    x[:] = [0,0,0,0]

虽然xinsideswatch是一个局部变量,因为swatch被调用

swatch(x)  # the global variable x

它指向与同名全局变量相同的列表。

x[:] = ...改变, 同时仍指向原始列表的内容。因此,这也改变了全局变量指向的值。xxx


def switch(a,b,x):
     x[a], x[b] = x[b], x[a]

是另一个示例,其中的内容发生了x变异,但x仍指向原始列表。因此,改变局部也会x改变全局x

于 2013-05-18T15:04:42.850 回答