这是两种方法。一个修改变量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]
答案 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()
但是,在这种情况下,由于x
是mutable,您可以像这样定义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
。