首先,一些术语:
参数(实际参数):传递给函数的实际变量;
参数(形式参数):函数中使用的接收变量。
在Python中,参数是通过赋值传递的(与其他语言相反,在其他语言中,参数可以通过值/引用/指针传递)。
修改参数会修改参数(如果参数的类型是可变的)。
def foo(x): # 这里x是参数
x[0] = 9 # 这会使由x和y标记的列表发生突变
print(x)
y = [4, 5, 6]
foo(y) # 以y为参数调用foo
# 出:[9、5、6] # x标记的列表已被突变
print(y)
# 出:[9、5、6] # 标记为y的列表也已被突变
重新分配参数不会重新分配参数。
def foo(x): # 这里x是参数, when we call foo(y) we assign y to x
x[0] = 9 # 这会使由x和y标记的列表发生突变
x = [1, 2, 3] # x现在正在标记其他列表(y不受影响)
x[2] = 8 # 这会改变x的列表,而不是y的列表
y = [4, 5, 6] # y是参数,x是参数
foo(y) # Pretend that we wrote "x = y", then go to line 1
y
# 出:[9、5、6]
在Python中,我们实际上并未为变量分配值,而是将变量(被视为name)绑定(即分配,附加)到对象。
不可变:整数,字符串,元组等。所有操作都会进行复印。
可变的:列表,字典,集合等。操作可能会发生变异,也可能不会发生变异。
x = [3, 1, 9] y = x x.append(5) # 更改以x和y标记的列表,x和y都绑定到[3,1,9] x.sort() # 突变由x和y标记的列表(就地排序) x = x + [4] # 不更改列表(仅复制x而不是y) z = x # z是x([1、3、9、4]) x += [6] # 突变由x和z标记的列表(使用扩展功能)。 x = sorted(x) # 不更改列表(仅复制x)。 x # 输出:[1、3、4、5、6、9] y # 输出:[1、3、5、9] z # 输出:[1、3、5、9、4、6]