在Python中,理解数据类型的可变性与可哈希性是编写高效代码的基础。本文将详细讨论Python中不同类型对象的可变性和哈希性,包括它们的优缺点和适用场景,帮助开发者更好地选择合适的数据类型。
数据类型 | 可变性 | 哈希性 | 优点 | 缺点 | 适用场景 | 示例 |
---|---|---|---|---|---|---|
int | 不可变 | 可哈希 | 简单、可哈希 | 修改需新建对象 | 存储数值 | x = 5 |
float | 不可变 | 可哈希 | 精确度高、可哈希 | 修改需新建对象 | 科学计算 | x = 3.14 |
str | 不可变 | 可哈希 | 安全、可哈希 | 修改需新建对象 | 文本处理 | s = "hello" |
tuple | 不可变 | 可哈希 | 安全、可哈希 | 修改需新建对象 | 多线程共享数据 | t = (1, 2, 3) |
list | 可变 | 不可哈希 | 灵活、支持修改 | 线程不安全 | 动态数组 | lst = [1, 2, 3] |
dict | 可变 | 不可哈希 | 快速查找、键值对存储 | 不能作为字典键 | 快速存储、查找 | d = {"a": 1} |
set | 可变 | 不可哈希 | 支持去重、集合运算 | 无法嵌套 | 去重操作、集合运算 | s = {1, 2, 3} |
frozenset | 不可变 | 可哈希 | 安全、可哈希 | 不能修改 | 不变集合 | fs = frozenset([1, 2, 3]) |
特性 | source test.sh | bash test.sh | ./test.sh |
---|---|---|---|
执行环境 | 当前 Shell | 子 Shell | 子 Shell |
环境变量影响 | 会影响当前 Shell | 不影响当前 Shell | 不影响当前 Shell |
脚本权限 | 不需要执行权限 | 不需要执行权限 | 需要执行权限 |
执行速度 | 较快(无子 Shell 开销) | 较慢(有子 Shell 开销) | 较慢(有子 Shell 开销) |
使用场景 | 改变当前 Shell 环境 | 独立执行脚本 | 独立执行脚本 |
在配置 vsftpd 的过程中,我遇到了一个问题:将虚拟用户的名字改为和本地同名(存在)的用户时,无法登录 FTP,即虚拟用户可以登录 FTP,但本地用户不能登录,(虚拟用户和本地用户不能共存)。
实验后,发现将 /etc/pam.d/vsftpd
中的以下两行注释掉,然后把里面的其他内容都打开注释,本地用户就能登录了:
bashauth required pam_userdb.so db=/etc/vsftpd/vuser_passwd account required pam_userdb.so db=/etc/vsftpd/vuser_passwd
这证明了是 PAM 模块认证的问题导致虚拟用户和本地用户不能共存。于是我去了解了一下 PAM 配置的内容,发现 required
需要所有内容都满足才行。当前两条配置是先验证虚拟用户登录通过,再继续向下验证是否是本地用户。由于验证本地用户的 control_flag
也为 required
,所以会返回错误,导致验证不成功。