可变类型

20251016

16:33

    Python 中列表是引用传递

    l=[1,2]

    def f(x):

    x.append(0)

    return

     

    执行f(l)后,l变成[1,2,0]

     

    在 Python 中,数据类型按传递方式可分为不可变类型(值传递)和可变类型(引用传递)。其中,可变类型在函数传递时是引用传递,即函数接收的是原对象的引用,修改会影响外部对象。

    常见的引用传递(可变类型) 包括:

    1. 列表(list)如 [1, 2, 3],函数内对列表的修改(如 appendpop、直接赋值元素)会影响外部列表。
      python

      运行

      def modify_list(lst):
          lst.append(
      4)  # 外部列表会被修改

      my_list = [1, 2, 3]
      modify_list(my_list)
      print(my_list)  # 输出 [1, 2, 3, 4]
    2. 字典(dict)如 {"name": "Alice"},函数内修改字典的键值对会影响外部字典。
      python

      运行

      def modify_dict(d):
          d[
      "age"] = 30  # 外部字典会被修改

      my_dict = {"name": "Alice"}
      modify_dict(my_dict)
      print(my_dict)  # 输出 {"name": "Alice", "age": 30}
    3. 集合(set)如 {1, 2, 3},函数内对集合的修改(如 addremove)会影响外部集合。
      python

      运行

      def modify_set(s):
          s.add(
      4)  # 外部集合会被修改

      my_set = {1, 2, 3}
      modify_set(my_set)
      print(my_set)  # 输出 {1, 2, 3, 4}
    4. 自定义对象(class instances)自定义类的实例对象,函数内修改其属性会影响外部对象。
      python

      运行
      class Person:
         
      def __init__(self, name):
              self.name = name

      def modify_person(p):
          p.name =
      "Bob"  # 外部对象的属性会被修改

      person = Person("Alice")
      modify_person(person)
      print(person.name)  # 输出 "Bob"
    5. 其他可变容器如 collections 模块中的 defaultdictdeque 等,本质是可变类型,遵循引用传递。

    与不可变类型的对比

    不可变类型(如 intstrtuplefloatbool)是值传递,函数内修改不会影响外部对象(实际是创建了新对象):

    python

     

    运行

     

    def modify_int(x):
        x =
    100  # 仅修改局部变量,不影响外部

    num = 10
    modify_int(num)
    print(num)  # 输出 10(未被修改)

    核心规律

    • 可变类型(可在原地修改):引用传递,修改影响外部。
    • 不可变类型(无法原地修改,修改会创建新对象):值传递,修改不影响外部。

    这一特性源于 Python 对内存的管理方式:可变类型支持原地修改,因此无需创建新对象;不可变类型则必须通过创建新对象实现「修改」,因此传递的是值的副本。

     

     

 

已使用 OneNote 创建。