Python参数传递和可变性

示例

首先,一些术语:

  • 参数(实际参数):传递给函数的实际变量;

  • 参数(形式参数):函数中使用的接收变量。

在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]