Python 中列表是引用传递
l=[1,2]
def f(x):
x.append(0)
return
执行f(l)后,l变成[1,2,0]
在 Python
中,数据类型按传递方式可分为不可变类型(值传递)和可变类型(引用传递)。其中,可变类型在函数传递时是引用传递,即函数接收的是原对象的引用,修改会影响外部对象。
常见的引用传递(可变类型) 包括:
- 列表(list)如 [1, 2, 3],函数内对列表的修改(如 append、pop、直接赋值元素)会影响外部列表。
python
运行
def modify_list(lst):
lst.append(4) # 外部列表会被修改
my_list = [1, 2, 3]
modify_list(my_list)
print(my_list) # 输出
[1, 2, 3, 4]
- 字典(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}
- 集合(set)如 {1, 2, 3},函数内对集合的修改(如 add、remove)会影响外部集合。
python
运行
def modify_set(s):
s.add(4) # 外部集合会被修改
my_set = {1, 2, 3}
modify_set(my_set)
print(my_set) # 输出 {1, 2, 3, 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"
- 其他可变容器如 collections 模块中的 defaultdict、deque 等,本质是可变类型,遵循引用传递。
与不可变类型的对比
不可变类型(如 int、str、tuple、float、bool)是值传递,函数内修改不会影响外部对象(实际是创建了新对象):
python
运行
def modify_int(x):
x = 100 # 仅修改局部变量,不影响外部
num = 10
modify_int(num)
print(num) # 输出 10(未被修改)
核心规律
- 可变类型(可在原地修改):引用传递,修改影响外部。
- 不可变类型(无法原地修改,修改会创建新对象):值传递,修改不影响外部。
这一特性源于 Python
对内存的管理方式:可变类型支持原地修改,因此无需创建新对象;不可变类型则必须通过创建新对象实现「修改」,因此传递的是值的副本。