网站首页 > 技术文章 正文
Python 中最基本的概念之一是可变对象和不可变对象之间的区别,它经常让初学者(甚至经验丰富的开发人员)感到困惑。了解这些类型的工作原理对于掌握 Python 和编写高效、无错误的代码至关重要。
Python 中的变量是什么?
在 Python 中,变量本质上是引用存储在内存中的数据的标签。将值分配给变量时,将创建对该值的引用,而不是副本。例如:
x = 42
这里, x 是对存储在内存中某个位置的整数 42 的引用。如果 您稍后分配:
y = x
x 和 y 都引用相同的 42。这个概念对于理解可变对象和不可变对象之间的区别至关重要。
可变与不可变:有什么区别?
在 Python 中,每个对象(无论是数字、字符串、列表等)都被归类为可变或不可变。
不可变对象
不可变对象在创建后无法更改。如果尝试修改它,Python 将在内存中创建一个新对象并引用该新对象。常见的不可变对象包括:
o 整数 (int)
o 浮点数 (float)
o 字符串 (str)
o Tuples (元组)
o 布尔值 (bool)
让我们看一个例子:
a = 10
b = a
a = 20
print(b) # Output: 10
在上面的代码中,当 a 被分配一个新值 (20) 时,Python 不会改变值 10,而是创建一个新的整数对象 (20) 并分配 a 指向它。变量 b 仍然引用原始 10。
可变对象
另一方面,可变对象可以在创建后进行更改。这意味着,如果修改可变对象,则是在原地修改它,而不是创建新对象。常见的可变对象包括:
o 列表 (list)
o 词典 (dict)
o 套 (set)
o 用户定义的类 (默认)
下面是一个使用列表的示例:
my_list = [1, 2, 3]
another_list = my_list
my_list.append(4)
print(another_list) # Output: [1, 2, 3, 4]
请注意,修改 my_list 后,更改将反映在 another_list 中,因为这两个变量都引用内存中的同一对象。
为什么这很重要?
了解可变对象和不可变对象之间的区别至关重要,因为它会影响代码的行为方式,尤其是在将变量传递到函数时。
函数参数和可变性
当将不可变对象(如数字或字符串)传递给函数时,Python 会传递对该对象的引用。但是,由于对象是不可变的,因此函数中的任何修改都会创建一个新对象,而不是更改原始对象。
def modify_value(num):
num += 10
x = 5
modify_value(x)
print(x) # Output: 5
变量 x 保持 5,因为整数是不可变的。现在,看看可变对象会发生什么:
def modify_list(lst):
lst.append(4)
my_list = [1, 2, 3]
modify_list(my_list)
print(my_list) # Output: [1, 2, 3, 4]
在这里,my_list 被修改,因为列表是可变的,并且该函数会就地更改列表。
潜在陷阱
当在函数中使用可变默认参数时,会出现一个常见问题:
def add_item(item, items=[]):
items.append(item)
return items
print(add_item(1)) # Output: [1]
print(add_item(2)) # Output: [1, 2]
print(add_item(3)) # Output: [1, 2, 3]
由于列表是可变的,因此默认参数项在函数调用中保持不变。更好的方法是:
def add_item(item, items=None):
if items is None:
items = []
items.append(item)
return items
结论
了解可变性对于编写干净、高效的 Python 代码至关重要。了解哪些对象是可变的,哪些对象是不可变的,这有助于您避免意外的副作用、优化性能并编写符合预期行为的函数。根据经验:
o 对不应更改的值使用不可变类型。
o 当需要就地修改或更新数据时,请使用可变类型。
通过掌握可变对象和不可变对象之间的区别,将更深入地了解 Python 的内部工作原理,从而获得更高效和可维护的代码。
- 上一篇: 一文读懂Python中的全局变量局部变量和作用域
- 下一篇: Python函数中的全局变量与局部变量
猜你喜欢
- 2025-06-08 Python函数中的全局变量与局部变量
- 2025-06-08 一文读懂Python中的全局变量局部变量和作用域
- 2025-06-08 python的变量,变量赋值的一些规范
- 2025-06-08 变量:Python里的“容器”一般人可看不懂
- 2025-06-08 Python 变量和数据类型(python中变量类型可以变吗)
- 2025-06-08 精通 Python 中的实例变量:入门指南
- 2025-06-08 C++和python的变量对比(c c++ python区别)
- 2025-06-08 Python零基础小白入门须知变量与常量区别详解
- 2025-06-08 Python-变量、函数、模块、包(python变量有什么用)
- 2025-06-08 一文理解 Python 中的实例变量(python变量举例)
- 264℃Python短文,Python中的嵌套条件语句(六)
- 263℃python笔记:for循环嵌套。end=""的作用,图形打印
- 261℃PythonNet:实现Python与.Net代码相互调用!
- 256℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 256℃Python实现字符串小写转大写并写入文件
- 116℃原来2025是完美的平方年,一起探索六种平方的算吧
- 96℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 89℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
-
- 金母鸡量化教学场:pandas—数据挖掘的Python库
- 分享一个用于商业决策数据挖掘的python案例
- Python图像识别实战(二):批量图像读取和像素转换(附源码)
- 从小白到大神,这10个超实用的 Python 编程技巧不可少
- 太震撼!527页战略级Python机器学习实战,实用度碾压群书!附PDF
- 一篇文章带你解析Python进程(一篇文章带你解析python进程怎么写)
- 大数据分析师如何进行数据挖掘?大数据分析师丨 2025 年报考攻略
- UG编程第34节:浅谈机床坐标系(ug编程机床坐标系细节)
- 想入门Python?先狠下心来死磕这7个方向
- Python大屏看板最全教程之Pyecharts图表
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)