参数的传递

函数的参数传递本质上就是:从实参到形参的赋值操作。 Python 中“一切皆对象”,所有的赋值操作都是“引用的赋值”。所以,Python 中参数的传递都是“引用传递”,不是“值传递”。具体操作时分为两类:

  1. 对“可变对象”进行“写操作”,直接作用于原对象本身。
  2. 对“不可变对象”进行“写操作”,会产生一个新的“对象空间”,并用新的值填充这块空间。(起到其他语言的“值传递”效果,但不是“值传递”)
  • 可变对象有:
    字典、列表、集合、自定义的对象等
  • 不可变对象有:
    数字、字符串、元组、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() 函数的一些特点:

  1. 对于同一个对象,无论何时调用 id(),返回的标识符都是相同的。
  2. 不同的对象具有不同的标识符,即使它们的值相同。
  3. 标识符在对象的生命周期中保持不变。一旦对象被创建,其标识符就不会改变。
  4. 标识符是唯一的,不同对象的标识符不会重复。

下面是一些示例,演示 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() 函数返回的标识符是一个整数,不能用于比较对象的相等性。要比较对象的值是否相等,应使用 == 运算符。