Python数据结构深入讲解:列表、字典、元组,彻底搞懂!

python入门(序列 列表 元组 字符串 字典) 序列 列表 元组 字符串 字典 阅读详情

包含编程籽料、学习路线图、爬虫代码、安装包等!【点击领取】

前言
Python作为一门简洁而强大的编程语言,其内置的数据结构是每位Python开发者必须掌握的基础知识。本文将深入讲解Python中最常用的三种数据结构:列表(List)、字典(Dict)和元组(Tuple),通过对比分析、实际示例和底层原理剖析,帮助读者彻底理解这些数据结构的特点和使用场景。

一、Python数据结构概述
在开始具体讲解前,我们先了解Python中主要的数据结构及其分类:

序列类型:列表(list)、元组(tuple)、字符串(str)

映射类型:字典(dict)

集合类型:集合(set)、冻结集合(frozenset)

本文将重点讨论列表、字典和元组这三种最常用的数据结构。

二、列表(List)深入解析
2.1 列表的基本特性
列表是Python中最灵活的有序集合类型,具有以下特点:

有序的集合,元素按插入顺序排列

可变的(mutable),可以修改内容

可以包含任意类型的对象

使用方括号[]表示,元素用逗号分隔

# 创建列表
numbers = [1, 2, 3, 4, 5]
mixed = [1, 'a', True, 3.14, [1, 2, 3]]

2.2 列表的底层实现
Python中的列表实际上是一个动态数组,而不是链表。其底层实现特点包括:

过度分配机制:列表在内存中分配的空间通常比实际需要的多,这是为了优化追加操作

摊销时间复杂度:虽然某些操作(如append)偶尔需要重新分配内存,但平均时间复杂度仍为O(1)

存储的是对象的引用:列表元素在内存中不连续存储,列表只存储指向各个元素的指针

2.3 列表常用操作及时间复杂度

在这里插入图片描述
2.4 列表推导式
列表推导式提供了一种简洁高效创建列表的方式:

# 普通方式
squares = []
for x in range(10):
    squares.append(x**2)

# 列表推导式
squares = [x**2 for x in range(10)]

# 带条件的列表推导式
even_squares = [x**2 for x in range(10) if x % 2 == 0]

2.5 列表的深浅拷贝
理解列表的拷贝机制非常重要:

# 浅拷贝
original = [[1, 2], [3, 4]]
shallow_copy = original.copy()  # 或 list(original) 或 original[:]

# 修改浅拷贝会影响原列表中的子列表
shallow_copy[0][0] = 'a'
print(original)  # 输出: [['a', 2], [3, 4]]

# 深拷贝
import copy
deep_copy = copy.deepcopy(original)
deep_copy[0][0] = 'b'
print(original)  # 输出仍为: [['a', 2], [3, 4]]

三、字典(Dict)深入解析
3.1 字典的基本特性
字典是Python中唯一的内置映射类型,具有以下特点:

无序的键值对集合(Python 3.7+保持插入顺序)

可变的(mutable),可以动态添加、修改和删除键值对

键必须是可哈希的类型(通常为不可变类型)

使用花括号{}表示,键值对用key: value表示

# 创建字典
person = {'name': 'Alice', 'age': 25, 'city': 'New York'}
grades = dict(math=90, physics=85, chemistry=88)

3.2 字典的底层实现
Python字典使用哈希表实现,其核心机制包括:

哈希函数:对键进行哈希计算,确定初始存储位置

开放寻址法:解决哈希冲突的策略

动态调整:当哈希表太满时会自动扩容,保持高效性

Python 3.6+的字典实现进行了优化,内存使用更高效,且保持了插入顺序。

3.3 字典常用操作及时间复杂度

在这里插入图片描述
3.4 字典推导式
类似于列表推导式,字典也有推导式语法:

# 普通方式
squares = {}
for x in range(5):
    squares[x] = x**2

# 字典推导式
squares = {x: x**2 for x in range(5)}

# 带条件的字典推导式
even_squares = {x: x**2 for x in range(10) if x % 2 == 0}

3.5 字典的特殊方法
字典提供了一些有用的方法:

# get方法,避免KeyError
value = d.get(key, default_value)

# setdefault,获取值,如果不存在则设置默认值
value = d.setdefault(key, default_value)

# update,批量更新键值对
d.update({'a': 1, 'b': 2})

# 三种视图方法
keys = d.keys()     # 键视图
values = d.values() # 值视图
items = d.items()   # 键值对视图

3.6 Python 3.9+的字典合并操作
Python 3.9引入了更简洁的字典合并语法:

# 传统方式
merged = dict1.copy()
merged.update(dict2)

# Python 3.9+
merged = dict1 | dict2  # 合并
dict1 |= dict2         # 原地更新

四、元组(Tuple)深入解析
4.1 元组的基本特性
元组是不可变的序列类型,具有以下特点:

有序的元素集合

不可变的(immutable),创建后不能修改

可以包含任意类型的对象

使用圆括号()表示,元素用逗号分隔

单元素元组需要尾随逗号:(x,)

# 创建元组
coordinates = (10.0, 20.0)
single_element = ('hello',)  # 注意尾随逗号
empty_tuple = ()

4.2 元组的底层实现
元组与列表的底层实现类似,都是存储对象的引用,但有以下区别:

不可变性:元组一旦创建,其内容不能改变

内存优化:Python会对小元组进行缓存和重用

固定长度:元组长度固定,不需要过度分配机制

4.3 元组的优势
虽然元组功能看似比列表少,但在某些场景下更有优势:

性能更好:创建和访问比列表稍快

线程安全:不可变性使其天然线程安全

可哈希性:可以作为字典的键

数据完整性:确保数据不会被意外修改

4.4 命名元组
collections.namedtuple提供了更易用的元组类型:

from collections import namedtuple

# 创建命名元组类型
Point = namedtuple('Point', ['x', 'y'])

# 实例化
p = Point(10, 20)

# 访问字段
print(p.x)  # 输出: 10
print(p.y)  # 输出: 20

五、三种数据结构的对比
5.1 特性对比表

在这里插入图片描述
5.2 何时使用哪种结构
使用列表:

需要有序的、可变的元素集合

元素通常是同类型的

需要频繁修改集合内容(增删改)

使用字典:

需要通过键快速查找值

数据具有天然的映射关系

需要统计频率或建立索引

使用元组:

数据不应该被修改

需要作为字典的键

函数返回多个值时

保证数据完整性

六、高级话题
6.1 数据结构的选择对性能的影响
选择合适的数据结构可以显著影响程序性能:

# 不推荐:使用列表检查成员存在性(O(n))
if item in my_list:  # 慢
    pass

# 推荐:使用集合或字典(O(1))
if item in my_set:   # 快
    pass

6.2 字典视图的妙用
字典的keys(), values(), items()返回视图对象:

d = {'a': 1, 'b': 2, 'c': 3}

# 视图是动态的
keys = d.keys()
d['d'] = 4
print(keys)  # 输出: dict_keys(['a', 'b', 'c', 'd'])

# 集合操作
d1 = {'a': 1, 'b': 2}
d2 = {'b': 3, 'c': 4}
common_keys = d1.keys() & d2.keys()  # {'b'}

6.3 元组拆包和序列拆包
Python支持灵活的拆包操作:

# 基本拆包
x, y = (10, 20)

# 扩展拆包
first, *rest = [1, 2, 3, 4, 5]  # first=1, rest=[2,3,4,5]

# 字典拆包
def foo(a, b, c):
    print(a, b, c)

d = {'a': 1, 'b': 2, 'c': 3}
foo(**d)  # 输出: 1 2 3

七、总结
Python的列表、字典和元组是构建复杂程序的基础,每种结构都有其独特的优势和适用场景:

列表是最灵活的序列类型,适合需要频繁修改的有序集合

字典提供了高效的键值查找,适合映射关系的数据

元组提供了不可变性和更优的性能,适合固定数据集合

理解这些数据结构的底层实现和特性,能够帮助我们在实际编程中做出更明智的选择,编写出更高效、更优雅的Python代码。

加粗样式八、练习题
为了巩固所学知识,尝试解决以下问题:

实现一个函数,统计列表中各元素出现的频率,返回一个字典

使用元组拆包交换两个变量的值

编写一个列表推导式,生成1-100中所有能被3或5整除的数字的平方

比较两个字典的差异,返回新增、删除和修改的键值对

希望这篇深入讲解能帮助你彻底理解Python的列表、字典和元组!如果有任何问题,欢迎在评论区留言讨论。

最后:
希望你编程学习上不急不躁,按照计划有条不紊推进,把任何一件事做到极致,都是不容易的,加油,努力!相信自己!

文末福利
最后这里免费分享给大家一份Python全套学习资料,希望能帮到那些不满现状,想提升自己却又没有方向的朋友,也可以和我一起来学习交流呀。

包含编程资料、学习路线图、源代码、软件安装包等!【点击这里】领取!
① Python所有方向的学习路线图,清楚各个方向要学什么东西
② 100多节Python课程视频,涵盖必备基础、爬虫和数据分析
③ 100多个Python实战案例,学习不再是只会理论
④ 华为出品独家Python漫画教程,手机也能学习

在这里插入图片描述

Python常见数据结构整理 Python中常见的数据结构可以统称为容器(container)。序列(如列表和元组)、映射(如字典)以及集合(set)是三类主要的容器。 阅读详情

相关推荐

Python教程:一文了解10种数据结构在Python中的实现方法

数据结构是计算机科学中非常重要的概念,它用于组织和存储数据,使得数据可以高效地被访问和操作。在编程中,选择合适的数据结构对于解决问题和提高程序性能至关重要。

旦莫的博客 3348

python 常用的8种经典数据结构

python原生数据结构:元组Tuple(),列表List[],集合Set{},字典Dictionary{A:B}; NumPy包中的数据结构:数组Ndarray(带多种操作),矩阵Matrix(多种线性代数计算); Pandas包中的数据结构:序列Series(索引+1列数据),数据框DataFrame(索引+多列数据表)。......

weixin_45044554的博客 2万+

华为昇腾910B3显卡实战:手把手教你部署DeepSeek 32B模型(含Bge-zh向量库配置)

本文详细介绍了在配备8张华为昇腾910B3显卡的服务器上,从零部署DeepSeek 32B大模型推理服务的完整实战方案。内容涵盖环境准备、模型配置、多卡负载分配,并集成了BGE中文向量模型与ChromaDB向量数据库,最终通过Open WebUI构建了可投入生产的企业级AI应用栈,为私有化大模型部署提供了具体参考。

weixin_29038345的博客 1709

Python中的数据结构

Python中内置的数据结构有六种:Number (数值)、String (字符串)、list (列表)、Tuple(元组),Dictionary (字典)、Set (集合),除此以队外,数组、矩阵等结构需要导入工具包后才可以实现 数值和字符串 本单元主要讲解了Python中的数据结构 – 数值和字符串类型的基础操作。 详细内容要点: 1、数值类型的使用; 2、字符串的使用: 1)字符串的声明; 2)转义字符串; 3)原始字符串; 4)字符串的操作与运算。 操作时避免出错的点: 1、中英文符号:Pytho.

qq_46344220的博客 7324

FMC/FSMC/EXMC总线NORFlash/PSRAM接口(异步-复用-不突发/同步-复用-突发)

目录 1 简介 1.1 框图 1.2 接口定义 1.3 读写时序图、时序配置参数 1.4 PSRAM控制器异步工作模式分类 1.5 PSRAM寄存器配置 1.5.1 控制寄存器BCR 1.5.2 片选时序寄存器BTR 1.5.3 写入时序寄存器BWTR 2 FPGA接口设计 2.1 实际配置的时序 2.2 接口信号处理 3 参考文献 1 简介 使...

leixj的博客 2万+

PX4实战指南:通过遥控器通道直连实现舵机PWM控制

本文详细介绍了如何通过PX4飞控实现遥控器通道直连控制舵机PWM输出的完整流程。从硬件准备、遥控器配对到PX4参数配置和硬件连接,提供了实战技巧和常见问题解决方案,帮助无人机爱好者快速掌握舵机控制技术。重点讲解了AUX Passthrough模式设置和PWM参数调整等关键步骤。

weixin_29195217的博客 154

彻底搞懂Python字典

一、字典简介 字典(dictionary)是包含若干“键:值”元素的无序可变序列,字典中的每个元素包含用冒号分隔开的“键”和“值”两部分,表示一种映射或对应关系,也称关联数组。 定义字典时,每个元素的“键”和“值”之间用冒号分隔,不同元素之间用逗号分隔,所有的元素放在一对大括号“{}”中。 字典中元素的“键”可以是Python中任意不可变数据,例如整数、实数、复数、字符串、元组等类型等可哈希数据...

zag666的博客 3591

科研党福音:如何用Zotero+Paper Agent打造你的AI论文速递系统(附详细配置教程)

本文为科研工作者提供了一套利用Zotero和开源工具Paper Agent构建自动化AI论文速递系统的详细教程。该系统能基于用户在Zotero中的文献库智能学习研究兴趣,每日自动从arXiv等平台筛选、下载并深度解读最相关的前沿论文,生成个性化日报,实现从被动接收到主动精准获取的知识工作流重塑。

kite3的博客 515

轻松搞懂python字典操作

在Python中,字典(Dictionary)是一种无序的、可变的、有键(key)和值(value)对应关系的集合数据类型。字典用大括号{}来表示,每个元素是一个键值对,键和值之间用冒号分隔,键值对之间用逗号分隔。字典的键必须是唯一的,但值则不必。字典是一种高效的数据结构,可以用于快速查找和检索数据。

2302_77361311的博客 1763

USRP N210与MATLAB连接实战:从驱动安装到信号接收

本文详细介绍了USRP N210与MATLAB连接的完整流程,涵盖驱动安装、网络配置、支持包安装及信号接收实战。重点解决了安装过程中的常见错误和硬件连接问题,并通过MATLAB代码示例展示了如何配置接收器、处理信号数据,帮助用户快速实现从设备对接到信号分析的全过程。

blue的专栏 820

学Simulink——基于Simulink的超前-滞后校正控制器设计与仿真建模示例

本文完成了基于 Simulink 的超前-滞后校正控制器设计与仿真,实现了:✅掌握超前与滞后校正的物理意义与设计流程✅分步设计复合控制器,兼顾动态与稳态✅在 Simulink 中搭建闭环系统并验证卓越性能✅达成高稳定裕度、高精度、快速响应三大目标。

xiaoheshang_123的博客 78

Python元组:小白也能懂的完全指南

作为Python中最基础的数据结构之一,元组(tuple)是每个初学者必须掌握的内容。它看起来简单,但在实际编程中有着不可替代的作用。今天我就用最通俗的语言,带大家彻底搞懂这个看似简单却暗藏玄机的数据类型。遇到问题时还能随时查看文档或询问AI助手,对自学Python的同学来说真的很方便。元组这类基础概念,通过即时运行代码来学习效果最好,能直观看到每个操作的结果。我试过他们的交互式环境,特别适合新手学习基础语法。元组可以理解为一种不可变的列表。通过这个练习,你能体会到元组在组织结构化数据时的优势。

AmberLeopard26的博客 638

8、干式变压器

干式变压器的发展,是人类不断挑战材料科学和热物理极限的过程,每一次技术突破,都是在。温度升高,ε_r反而下降(因为分子活动性增强,极化响应变慢)。:固体导热的热阻比液体对流大一个数量级,这是无法逾越的物理规律。Nomex在高温下不是逐渐分解,而是保持性能直到一个临界点。如果 T_a = 40°C,则 T_c = 146.7°C。干式变压器(固体介质分隔):热场、电场、流场(空气)形成三维氢键网络,即使在高温下也能保持机械强度。:不是在现有技术上修修补补,而是寻找新的。仍在H级绝缘允许范围内(≤180°C)

renpeng2692873032的博客 228

Python 元组:初学者入门到精通的完整指南

元组(Tuple)是 Python 中一种有序、不可变的序列类型,用于存储多个不同类型的数据。它的语法非常简单:用小括号()包裹元素,元素之间用逗号分隔。# 存储不同类型数据的元组student = ("小明", 20, "计算机专业", 85.5)# 存储单一类型数据的元组# 空元组这里需要注意一个 “特殊情况”:如果元组中只有一个元素# 正确:单元素元组(必须加逗号)print(type(single_tuple)) # 输出:<class 'tuple'>

2501_93253814的博客 560

[QMT量化交易小白入门]-四十四、年化收益48%的策略要兼容回测和实盘,将实盘改为定时任务的方式

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 1373

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

重走Python之路:一文搞懂列表(list)操作的方法

☆写在前面 任何一个算法,都是由逻辑和数据结构组成的。现在流行与世的编程语言有很多,比如Java、Python、C、C++等等,使用不同的编程语言可以实现一个相同的算法,除了一般的编程语言本身的语法规则有差异之外,主要的差异就在于编程语言支持的数据结构,因为逻辑都是一样的。一个好的数据结构,将使得编程过程、算法运行效率都更加的巴适!!! Python语言是大家公认的最容易上手的语言,其背后的一个最重要的原因就是Python值支持的数据结构非常的灵活和完备,这篇文章要介绍的就是最为常用的一个序列数据结构

weixin_43038752的博客 758

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Python元组(Tuple)详解:从基础特性到实战避坑

元组是Python中一种有序、不可变、可重复的数据集合,用圆括号()表示(元素间用逗号分隔)。# 基本元组# 单元素元组(注意必须加逗号,否则会被识别为普通变量)single_tuple = (100,) # 正确:元组not_tuple = (100) # 错误:本质是整数100# 多类型元素元组(支持混合类型,与列表一致)# 嵌套元组元组的核心特性有序性:元素按插入顺序排列,支持索引访问(同列表);不可变性:一旦创建,元素的个数、值、顺序都不能修改(区别于列表的核心点);轻量性。

qq2745567641的博客 981

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Python容器类型深度解析:从数据结构原理到高效编程实践

数据结构是计算机科学的核心基础,它定义了数据的组织、存储和访问方式,直接影响程序的性能和可维护性。在Python中,内置的容器类型如列表、字典、元组和集合,正是经典数据结构思想的实现。列表基于动态数组,支持快速索引访问;字典和集合底层采用哈希表,实现了接近O(1)时间复杂度的快速查找;元组则因其不可变性,确保了数据安全并支持哈希。理解这些容器的底层原理,能帮助开发者在处理数据时做出更优选择,例如在需要快速键值查找时使用字典而非列表遍历,或在需要数据不可变时使用元组。这些知识在数据处理、Web开发、科学计算等

weixin_30883311的博客 394

Python字典(dict)全方位解析:从基础用法到高级实战优化

本文深入解析Python字典的底层原理与高效使用技巧。字典作为基于哈希表的键值对结构,具有O(1)查找效率,键必须为不可变类型。文章从四个维度展开:1)底层哈希表原理,揭示字典高效查找机制;2)基础增删改查操作,对比不同方法差异;3)高级特性如字典推导式、嵌套结构;4)实战优化技巧。重点讲解了get()方法、update()批量操作、pop()删除等核心用法,并通过示例展示如何避免常见错误。掌握这些知识能显著提升字典使用效率,解决实际开发中的数据映射问题。

qq2745567641的博客 1422

字典推导式键值互换难倒你了吗?这6个真实场景案例帮你彻底搞懂

掌握Python字典推导式的键值交换技巧,轻松应对数据转换难题。涵盖反向映射、去重筛选等6大真实场景,简洁代码实现高效处理,提升编程效率。值得收藏的实用指南,点击了解具体用法。

ProceChat的博客 780

python入门到精通(三)| 元组

python入门到精通(三)| 元组一、元组的特点二、元组的综合案例 一、元组的特点 定义 用于存储一组数据的有序序列,一旦创建,元组元组中的各个元素不允许修改 特点 (1) 元组有序 (2) 元组是不可变的数据类型,不可修改,但是可以对元组进行连接组合 (3) 元组中可以存储重复的数据 (4) 元组中可以同时存储不同数据类型的数据 (5) 元组中只包含一个元素时,需要在元素后边添加一个逗号消除歧义 (6) 元组中包含列表元素,列表元素内容可以修改 创建元组 用小括号()括起来,单个元素括起来后加逗号(

qq_45134928的博客 458

学Python,需要知道的基本要素

OK,到这里我们已经掌握了Python的基础关键点,我知道你肯定忍不住想要放松一下奖励自己,但别着急,还有几个简单的知识点需要我们一起探讨,它们分别是模块和数据结构,不过相对于前面的基础它们稍微难懂一点,所以我在这里只是简单的提一下概念,具体的代码路径目前我也没搞懂,不过我相信慢慢的会搞懂的,毕竟代码还是要一个字一个字的写。**列表:**用来顺序存储相同或者不同类型数据的集合,使用一对[]定义,列表中存储的每一个值称为元素,在列表内可以存储多个元素,元素之间用逗号隔开,例如图1-3,

m0_59236602的博客 479

Python从入门到实战 (5):字典的核心用法与集合应用

本文介绍了Python中字典(dict)和集合(set)两种数据结构及其核心用法。字典是键值对映射结构,适用于通过键快速查找值,支持创建、查找、增删改等操作;集合是无序且不重复的数据容器,主要用于去重和数学运算。文章通过对比列表、字典和集合的特性,帮助读者理解不同结构的适用场景,并提供了学生成绩处理的实际案例,展示了如何利用这两种数据结构解决实际问题。掌握字典和集合能够显著提升数据处理效率,特别是在关联查询和去重需求方面。

2401_84134448的博客 876

Python期末复习全攻略之字典:字典(Dictionary)从入门到精通,拿下编程大题满分!

字典(dict)是一种可变的容器模型,它存储的是键值对(Key-Value Pair)。键(Key):就像电话簿里的名字,或者词典里的单词。它是查找的索引,必须唯一。值(Value):就像名字对应的电话号码,或者单词的解释。它可以是任何类型的数据。"hobbies": ["reading", "coding"] # 值也可以是列表!核心特性:基于键的快速查找。无论字典有多大,根据一个已知的键去查找对应的值,其时间复杂度通常接近O1O(1)O1,这是它比列表(OnO(n)On。

吾为热爱计科,致力于知识分享的践行者,此博客是我在这条道路上留下的足迹。 144
上一篇: 2025最新超详细PyCharm IDE安装环境配置完整版教程,看这一篇就足够了
下一篇: Python爬取天气数据实战教程:从入门到精通
Python_trys
博客等级 码龄2年 4369粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值