参数的传递
函数的参数传递本质上就是:从实参到形参的赋值操作。 Python 中“一切皆对象”,所有的赋值操作都是“引用的赋值”。所以,Python 中参数的传递都是“引用传递”
,不是“值传递”。具体操作时分为两类:
- 对“可变对象”进行“写操作”,直接作用于原对象本身。
- 对“不可变对象”进行“写操作”,会产生一个新的“对象空间”,并用新的值填充这块空间。(起到其他语言的“值传递”效果,但不是“值传递”)
- 可变对象有:
字典、列表、集合、自定义的对象等 - 不可变对象有:
数字、字符串、元组、function 等
传递可变对象的引用
传递参数是可变对象(例如:列表、字典、自定义的其他可变对象等),实际传递的还是对象的引用。在函数体中不创建新的对象拷贝,而是可以直接修改所传递的对象。
【代码】参数传递:传递可变对象的引用
b = [10,20]
def f2(m):
print("m:",id(m)) #b 和 m 是同一个对象
m.append(30) #由于 m 是可变对象,不创建对象拷贝,直接修改这个对象
f2(b)
print("b:",id(b))
print(b)
执行结果:
m: 45765960
b: 45765960
[10, 20, 30]
补充:id()函数
在Python中,id()
是一个内置函数,用于返回对象的唯一标识符(identity)。每个对象在Python中都有一个唯一的标识符,它在对象的生命周期内是不变的。
id()
函数的语法如下:
id(object)
其中,object
是要获取标识符的对象。id()
函数将返回一个整数,表示对象的标识符。
以下是 id()
函数的一些特点:
- 对于同一个对象,无论何时调用
id()
,返回的标识符都是相同的。 - 不同的对象具有不同的标识符,即使它们的值相同。
- 标识符在对象的生命周期中保持不变。一旦对象被创建,其标识符就不会改变。
- 标识符是唯一的,不同对象的标识符不会重复。
下面是一些示例,演示 id()
函数的用法:
x = 10
y = 10
print(id(x)) # 输出对象x的标识符
print(id(y)) # 输出对象y的标识符
# 创建一个新的列表对象
my_list = [1, 2, 3]
print(id(my_list)) # 输出列表对象的标识符
# 修改列表对象
my_list.append(4)
print(id(my_list)) # 列表对象的标识符不变
# 创建一个新的字符串对象
my_string = "Hello"
print(id(my_string)) # 输出字符串对象的标识符
需要注意的是,id()
函数返回的标识符是一个整数,不能用于比较对象的相等性。要比较对象的值是否相等,应使用 ==
运算符。