Python对象传递揭秘: immutable与mutable的区别

1 下载量 159 浏览量 更新于2024-08-29 收藏 80KB PDF 举报
在Python的世界里,"参数传递"这个概念常常被称为"黑魔法",因为它的行为有时可能让人感到困惑。Python中的对象概念深入人心,一切都可以视为对象,包括数字、字符串、函数甚至类。"万物皆对象"这一说法体现在`class A: pass`创建的`A()`实例,以及`def Func(): pass`定义的函数都是对象。 Python中的参数传递主要有两种方式:传值(call by value)和传引用(call by reference)。然而,Python的实际行为并非那么简单,它实际上是一种混合模式,主要取决于对象的类型。对于不可变对象(如整数、浮点数、布尔值和元组),Python采用的是"隐式传值",实际上是传递对象的值(一个不可变的副本),即使修改这些对象的副本,原对象保持不变。例如: ```python a = 3 b = a b = 3 + 1 # 虽然看似改变了b,但a仍然是3,因为整数加法返回新对象 ``` 当我们尝试改变元组的元素,如`a = (1, 2, 3)`,会抛出`TypeError`,因为元组是不可变的。 另一方面,可变对象(如列表、字典、集合和大部分自定义类的实例)则是通过引用传递。这意味着对这些对象的修改会影响到原始变量,因为它们的内部状态可以被改变: ```python a = [] b = a b.append(1) # a也被改变了,因为它是可变的列表 ``` Python中,基本数据类型的+运算符实际上返回的是新对象,而不是改变原对象,这可以通过`id()`函数验证,它会返回对象的唯一标识: ```python a = 3 b = a + 1 print(id(a), id(b)) # 输出不同的id,表明a和b指向的是不同对象 ``` 总结来说,Python中的参数传递并不是简单地按值或引用,而是根据对象的可变性来决定。理解这一点有助于我们更深入地掌握Python的动态特性,避免在实际编程中遇到意外的副作用。通过区分 immutable 和 mutable 对象,程序员能够更好地控制代码的行为和性能。