关于python:解释这种不一致

Explain this inconsistency

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
def swatch(x):

x定义为局部变量。

1
x = [0, 0, 0, 0]

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

你可以从swatch的论点中删除x

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

但是当python在函数定义中遇到赋值时

1
x = [0, 0, 0, 0]

默认情况下,python会将x视为局部变量。为该x赋值不会影响全局变量x

要告诉python您希望x是全局变量,需要使用global声明:

1
2
3
4
def swatch():
    global x
    x = [0,0,0,0]
swatch()

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

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

虽然swatch中的x是一个局部变量,因为swatch是用

1
swatch(x)  # the global variable x

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

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

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

是另一个例子,其中x的内容发生了变化,而x仍然指向原始列表。因此,突变局部的x也改变了全球的x