跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

Python 核心内置函数 len()、list()、locals() 详解

详细解析了 Python 三个核心内置函数 len()、list() 和 locals()。len() 用于获取对象长度,支持序列和集合等类型,常用于数据验证和边界检查;list() 用于从可迭代对象创建新列表,适用于数据转换和处理场景;locals() 返回局部命名空间字典,可用于调试和动态编程。文章提供了基础用法代码示例及实际应用类封装,并给出了安全使用建议、版本兼容性提醒及最佳实践,帮助开发者高效利用这些函数提升代码质量。

BackendPro发布于 2026/3/29更新于 2026/9/1073 浏览
Python 核心内置函数 len()、list()、locals() 详解

一、len():长度计算的尺子

1.1 基础用法:获取对象元素个数

len() 函数返回对象的长度(元素个数),支持序列和集合等多种数据类型。

# 序列类型长度计算
string = "Hello World"
print(f"字符串长度:{len(string)}")  # 输出:11

list_data = [1, 2, 3, 4, 5]
print(f"列表长度:{len(list_data)}")  # 输出:5

tuple_data = (10, 20, 30)
print(f"元组长度:{len(tuple_data)}")  # 输出:3

# 集合类型长度计算
set_data = {1, 2, 3, 2, 1}  # 去重后
print(f"集合长度:{len(set_data)}")  # 输出:3

dict_data = {'a': 1, 'b': 2, 'c': 3}
print(f"字典长度:{len(dict_data)}")  # 输出:3

# 范围对象
range_obj = range(1, 10)
print(f"范围对象长度:{len(range_obj)}")  # 输出:9

1.2 实际应用:数据验证和边界检查

class DataValidator:
    @staticmethod
    def validate_input_length(data, min_len=0, max_len=None):
        """验证输入数据长度"""
        data_len = len(data)
        if data_len < min_len:
            raise ValueError(f"数据长度不能小于{min_len}")
        if max_len is not None and data_len > max_len:
            raise ValueError(f"数据长度不能超过{max_len}")
        return True

    @staticmethod
    def chunk_data(data, chunk_size):
        """将数据分块"""
        if len(data) == 0:
            return []
        chunks = []
        for i in range(0, len(data), chunk_size):
            chunk = data[i:i + chunk_size]
            chunks.append(chunk)
        return chunks

    @staticmethod
    def compare_structures(struct1, struct2):
        """比较两个数据结构的长度"""
        len1 = len(struct1) if hasattr(struct1, '__len__') else 'N/A'
        len2 = len(struct2) if hasattr(struct2, '__len__') else 'N/A'
        return {
            'structure1_length': len1,
            'structure2_length': len2,
            'equal_length': len1 == len2 if isinstance(len1, int) and isinstance(len2, int) else False
        }

# 使用示例
validator = DataValidator()

# 长度验证
try:
    validator.validate_input_length("hello", min_len=3, max_len=10)
    print("长度验证通过")
except ValueError as e:
    print(f"验证失败:{e}")

# 数据分块
data = list(range(20))
chunks = validator.chunk_data(data, chunk_size=5)
print(f"数据分块:{chunks}")

# 结构比较
list1 = [1, 2, 3]
dict1 = {'a': 1, 'b': 2}
result = validator.compare_structures(list1, dict1)
print(f"结构比较:{result}")

二、list():列表创建的工厂

2.1 基础用法:创建列表对象

list() 函数从可迭代对象创建新的列表,是 Python 中最常用的序列类型。

# 从字符串创建(字符列表)
chars = list("hello")
print(f"字符串转列表:{chars}")  # 输出:['h', 'e', 'l', 'l', 'o']

# 从元组创建
tuple_data = (1, 2, 3)
list_from_tuple = list(tuple_data)
print(f"元组转列表:{list_from_tuple}")  # 输出:[1, 2, 3]

# 从范围对象创建
numbers = list(range(5))
print(f"范围转列表:{numbers}")  # 输出:[0, 1, 2, 3, 4]

# 从集合创建(顺序可能不同)
set_data = {3, 1, 4, 2}
list_from_set = list(set_data)
print(f"集合转列表:{list_from_set}")  # 输出:[1, 2, 3, 4](顺序可能变化)

# 空列表
empty_list = list()
print(f"空列表:{empty_list}")  # 输出:[]

# 从字典创建(只获取键)
dict_data = {'a': 1, 'b': 2}
keys_list = list(dict_data)
print(f"字典键列表:{keys_list}")  # 输出:['a', 'b']

2.2 实际应用:数据转换和处理

class ListProcessor:
    @staticmethod
    def flatten_nested_lists(nested_list):
        """展平嵌套列表"""
        result = []
        for item in nested_list:
            if isinstance(item, list):
                result.extend(ListProcessor.flatten_nested_lists(item))
            else:
                result.append(item)
        return result

    @staticmethod
    def remove_duplicates_preserve_order(sequence):
        """去重并保持顺序"""
        seen = set()
        return [x for x in sequence if not (x in seen or seen.add(x))]

    @staticmethod
    def batch_process(iterable, batch_size):
        """批量处理数据"""
        items = list(iterable)  # 确保是可迭代的
        batches = []
        for i in range(0, len(items), batch_size):
            batch = items[i:i + batch_size]
            batches.append(batch)
        return batches

    @staticmethod
    def create_index_map(data):
        """创建值到索引的映射"""
        index_map = {}
        for idx, value in enumerate(list(data)):
            if value not in index_map:
                index_map[value] = []
            index_map[value].append(idx)
        return index_map

# 使用示例
processor = ListProcessor()

# 展平嵌套列表
nested = [[1, 2], [3, [4, 5]], 6]
flat = processor.flatten_nested_lists(nested)
print(f"展平结果:{flat}")

# 去重保持顺序
data_with_duplicates = [3, 1, 2, 1, 4, 2, 5]
unique_ordered = processor.remove_duplicates_preserve_order(data_with_duplicates)
print(f"去重结果:{unique_ordered}")

# 批量处理
large_data = range(100)
batches = processor.batch_process(large_data, batch_size=10)
print(f"批次数量:{len(batches)}")
print(f"第一个批次:{batches[0]}")

# 索引映射
text = "hello"
index_map = processor.create_index_map(text)
print(f"字符索引映射:{index_map}")

三、locals():局部变量的镜子

3.1 基础用法:访问局部命名空间

locals() 函数返回当前局部符号表的映射对象,反映当前作用域的变量状态。

def demonstrate_locals():
    """演示 locals() 函数的基本用法"""
    x = 10
    y = "hello"
    z = [1, 2, 3]

    # 获取局部变量字典
    local_vars = locals()
    print("局部变量:")
    for var_name, var_value in local_vars.items():
        print(f" {var_name}: {var_value}")

    # 修改局部变量
    local_vars['x'] = 100
    local_vars['new_var'] = "动态添加"
    print(f"修改后 x 的值:{x}")  # 输出:100
    print(f"新变量:{new_var}")  # 输出:动态添加
    return local_vars

# 函数调用
local_dict = demonstrate_locals()
print(f"返回的局部字典:{local_dict}")

# 模块级别的 locals()(与 globals() 相同)
module_locals = locals()
module_globals = globals()
print(f"模块级别 locals 和 globals 相同:{module_locals is module_globals}")  # 输出:True

3.2 实际应用:调试和动态编程

class DebugHelper:
    def __init__(self):
        self.snapshots = {}

    def take_snapshot(self, snapshot_name):
        """拍摄当前局部状态快照"""
        current_locals = locals().copy()
        # 移除 self 参数
        current_locals.pop('self', None)
        self.snapshots[snapshot_name] = current_locals
        return current_locals

    def compare_snapshots(self, snap1_name, snap2_name):
        """比较两个快照的差异"""
        snap1 = self.snapshots.get(snap1_name, {})
        snap2 = self.snapshots.get(snap2_name, {})
        added = {k: v for k, v in snap2.items() if k not in snap1}
        removed = {k: v for k, v in snap1.items() if k not in snap2}
        changed = {}
        for k in set(snap1.keys()) & set(snap2.keys()):
            if snap1[k] != snap2[k]:
                changed[k] = (snap1[k], snap2[k])
        return {'added': added, 'removed': removed, 'changed': changed}

    def dynamic_variable_management(self, **kwargs):
        """动态变量管理"""
        current_locals = locals()
        print("初始局部变量:", current_locals)
        # 动态添加变量
        for key, value in kwargs.items():
            locals()[key] = value
            print(f"已添加变量:{key} = {value}")
        # 注意:在函数中修改 locals() 可能不会影响实际变量
        # 这里主要用于演示

def test_function():
    """测试函数用于演示 locals() 行为"""
    debugger = DebugHelper()
    # 第一次快照
    a = 10
    b = 20
    debugger.take_snapshot("第一次")
    # 第二次快照(变量变化)
    a = 100
    c = "新变量"
    debugger.take_snapshot("第二次")
    # 比较差异
    differences = debugger.compare_snapshots("第一次", "第二次")
    print("变量变化:", differences)
    # 动态管理
    debugger.dynamic_variable_management(x=1, y=2, z=3)

# 使用示例
test_function()

# 在推导式中的使用(Python 3.12+)
def demonstrate_comprehension_locals():
    """演示推导式中的 locals() 行为"""
    external_var = "外部变量"
    # 列表推导式
    result = [locals().get('external_var') for _ in range(3)]
    print(f"推导式中的 locals(): {result}")
    # 注意:在推导式中,locals() 的行为可能因 Python 版本而异

demonstrate_comprehension_locals()

四、高级技巧与最佳实践

4.1 安全使用 locals() 和变量管理

class SafeVariableManager:
    def __init__(self):
        self._protected_vars = {'self', '_protected_vars'}

    def get_public_variables(self):
        """获取公有变量(不包含保护变量)"""
        current_locals = locals()
        public_vars = {}
        for var_name, var_value in current_locals.items():
            if not var_name.startswith('_') or var_name in self._protected_vars:
                public_vars[var_name] = var_value
        return public_vars

    def cleanup_temporary_vars(self):
        """清理临时变量"""
        current_locals = locals()
        vars_to_remove = []
        for var_name in current_locals:
            if var_name.startswith('_temp_'):
                vars_to_remove.append(var_name)
        # 注意:在实际函数中,不能直接通过 locals() 删除变量
        # 这里返回需要删除的变量名列表
        return vars_to_remove

    def create_variable_report(self):
        """创建变量状态报告"""
        current_locals = locals()
        report = {
            'total_variables': len(current_locals),
            'variable_types': {},
            'variable_details': []
        }
        for var_name, var_value in current_locals.items():
            var_type = type(var_value).__name__
            if var_type not in report['variable_types']:
                report['variable_types'][var_type] = 0
            report['variable_types'][var_type] += 1
            report['variable_details'].append({
                'name': var_name,
                'type': var_type,
                'value_length': len(str(var_value)) if hasattr(var_value, '__len__') else 'N/A',
                'id': id(var_value)
            })
        return report

# 使用示例
def demonstrate_safe_management():
    manager = SafeVariableManager()
    # 添加一些测试变量
    normal_var = "正常变量"
    _temp_data = "临时数据"
    _protected_var = "保护变量"
    public_vars = manager.get_public_variables()
    print("公有变量:", public_vars)
    report = manager.create_variable_report()
    print("变量报告:", report)
    temp_vars = manager.cleanup_temporary_vars()
    print("需要清理的临时变量:", temp_vars)

demonstrate_safe_management()

4.2 组合使用多个函数

def advanced_data_analysis(data_sequence):
    """高级数据分析组合使用多个函数"""
    # 使用 list() 确保数据是可迭代的
    data_list = list(data_sequence)
    # 使用 len() 获取基本信息
    data_length = len(data_list)
    print(f"数据长度:{data_length}")
    # 使用 locals() 记录分析状态
    analysis_state = locals().copy()
    if data_length > 0:
        # 基本统计
        unique_elements = list(set(data_list))
        unique_count = len(unique_elements)
        analysis_state.update({'unique_count': unique_count, 'duplicate_count': data_length - unique_count, 'unique_elements': unique_elements})
        # 动态添加分析结果
        if 'unique_count' in analysis_state:
            duplication_rate = analysis_state['duplicate_count'] / data_length
            analysis_state['duplication_rate'] = round(duplication_rate, 2)
    return analysis_state

# 使用示例
test_data = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
result = advanced_data_analysis(test_data)
print("数据分析结果:")
for key, value in result.items():
    if not key.startswith('_') and key != 'analysis_state':
        print(f" {key}: {value}")

def dynamic_function_builder():
    """动态函数构建器"""
    # 获取当前局部变量
    current_locals = locals()
    # 动态创建函数
    function_definitions = [
        ('add', lambda x, y: x + y),
        ('multiply', lambda x, y: x * y),
        ('power', lambda x, y: x ** y)
    ]
    for func_name, func in function_definitions:
        current_locals[func_name] = func
        print(f"已创建函数:{func_name}")
    # 测试动态创建的函数
    if 'add' in current_locals:
        result = current_locals['add'](5, 3)
        print(f"动态函数测试:5 + 3 = {result}")

dynamic_function_builder()

五、总结与实用建议

通过本文的详细解析,我们深入了解了 Python 中三个重要的内置函数:

  1. len() - 长度计算的尺子
  2. list() - 列表创建的工厂
  3. locals() - 局部变量的镜子

关键知识点总结:

  • len(object) 返回对象的元素个数,支持大多数容器类型
  • list(iterable) 从可迭代对象创建新列表,是常用的序列转换函数
  • locals() 返回当前局部命名空间的字典,但在不同作用域中行为有差异

版本兼容性提醒:

  • Python 3.12+ 中推导式内的 locals() 行为有变化(PEP 709)
  • Python 3.13+ 中优化作用域内的 locals() 语义更加明确(PEP 667)
  • 注意大长度对象的 len() 可能引发 OverflowError

实用场景推荐:

  • len():数据验证、边界检查、循环控制
  • list():数据转换、序列处理、结果收集
  • locals():调试工具、动态编程、状态检查

最佳实践建议:

  1. 长度检查优先:在处理容器前先用 len() 检查大小
  2. 适时使用 list():需要修改或多次访问时,将可迭代对象转为列表
  3. 谨慎使用 locals():主要限于调试,生产代码中避免依赖其修改功能
  4. 异常处理:对可能的大数据使用 len() 时捕获 OverflowError

安全使用注意事项:

  • 修改 locals() 返回的字典可能不会影响实际变量(在函数作用域中)
  • 避免在性能关键代码中过度使用 list() 转换
  • 对用户输入数据使用 len() 前先验证数据类型

进阶学习方向:

  • 深入学习 Python 的迭代器协议和生成器表达式
  • 研究 __len__() 特殊方法的自定义实现
  • 了解命名空间和作用域的工作原理
  • 探索 inspect 模块更强大的内省功能

这三个函数虽然基础,但它们是 Python 编程的基石。合理使用它们可以让代码更加简洁、清晰,特别是在数据处理、调试和元编程场景中。从简单的长度检查到复杂的动态编程,掌握这些函数将显著提升你的 Python 编程能力。

目录

  1. 一、len():长度计算的尺子
  2. 1.1 基础用法:获取对象元素个数
  3. 序列类型长度计算
  4. 集合类型长度计算
  5. 范围对象
  6. 1.2 实际应用:数据验证和边界检查
  7. 使用示例
  8. 长度验证
  9. 数据分块
  10. 结构比较
  11. 二、list():列表创建的工厂
  12. 2.1 基础用法:创建列表对象
  13. 从字符串创建(字符列表)
  14. 从元组创建
  15. 从范围对象创建
  16. 从集合创建(顺序可能不同)
  17. 空列表
  18. 从字典创建(只获取键)
  19. 2.2 实际应用:数据转换和处理
  20. 使用示例
  21. 展平嵌套列表
  22. 去重保持顺序
  23. 批量处理
  24. 索引映射
  25. 三、locals():局部变量的镜子
  26. 3.1 基础用法:访问局部命名空间
  27. 函数调用
  28. 模块级别的 locals()(与 globals() 相同)
  29. 3.2 实际应用:调试和动态编程
  30. 使用示例
  31. 在推导式中的使用(Python 3.12+)
  32. 四、高级技巧与最佳实践
  33. 4.1 安全使用 locals() 和变量管理
  34. 使用示例
  35. 4.2 组合使用多个函数
  36. 使用示例
  37. 五、总结与实用建议

更多推荐文章

查看全部
  • JavaScript 基础语法与 jQuery 快速入门
  • OpenClaw 配置与 QQ 机器人接入指南
  • AI 一镜到底视频制作指南:教材插图转 VR 全景与提示词技巧
  • 卫星技术开发板,开源信号发生器,时域反射防篡改检测,电磁共振绘图板,隔离电源设计
  • Web3 学习:从 Bitcoin 到 Ethereum 智能合约
  • FPGA 实现 CIC 抽取滤波器:原理、位宽计算与 Verilog 实战
  • 基于 Stable Diffusion 的 AI 姓氏头像生成教程
  • 红黑树进阶:手撕 STL 源码封装 RB-tree 实现 map 和 set
  • Stable Diffusion XL 文本生成图像进阶控制技巧
  • Java Web 开发入门:基础概念、环境搭建与 Servlet/JSP
  • 家庭机器人落地难点分析:技术、成本与隐私
  • MySQL 环境配置实战:CentOS 7 与 Ubuntu 双系统安装指南
  • IntelliJ IDEA 2026.1 EAP:Java 26、Spring Boot 4 与 Gradle 9 适配
  • 使用豆包平台打造专属 Python 智能助手
  • Vue3 + TypeScript Promise<string> 转 string 类型错误解析与异步处理
  • Dockerfile 核心指令详解与实战指南
  • Java 2D 技术体系与常用类详解
  • C++红黑树原理与实现
  • GitHub 代码仓库初始化与首次推送指南
  • ChatGPT Go 在亚洲 16 国上线及三大使用限制

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online