解释这种不一致

时间:2013-05-18 15:02:50

标签: python mutability

这是两种方法。一个修改变量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]

1 个答案:

答案 0 :(得分: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]

虽然x内的swatch是一个局部变量,但由于swatch被调用

swatch(x)  # the global variable x

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

x[:] = ...改变x内容,而x仍然指向原始列表。因此,这会改变全局变量x指向的


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

是另一个示例,x的内容在x仍指向原始列表时发生变异。因此,改变本地x也会改变全局x