Python中的变量与数据类型

一、前言

"变量是什么?"

这是每个编程新手都会问的问题。

而在 Python 中,变量的概念既简单又微妙------它不像 C 或 Java 那样需要声明类型,却暗藏"对象引用"的玄机。

本文将带你: ✅ 理解 Python 变量的本质(不是"盒子",而是"标签")

✅ 掌握 6 大核心数据类型及其使用场景

✅ 区分"可变"与"不可变"对象,避免踩坑

✅ 用 id()is 深入理解内存机制

✅ 养成良好的变量命名与使用习惯


二、变量:Python 中的"名字标签"

在 Python 中,变量不是存储数据的容器,而是指向对象的"标签"或"引用"

对比传统语言(如 C):

  • C:int a = 10; → 在内存中开辟一块叫 a 的空间存 10
  • Python:a = 10 → 创建一个整数对象 10,然后让 a 指向它
python 复制代码
a = 10
b = a
print(id(a), id(b))  # 输出相同内存地址!

关键理解

Python 的变量 = 名字 + 引用(指针),真正的数据是"对象"。


三、Python 六大核心数据类型

Python 是动态类型语言,变量无需声明类型,解释器自动推断。但对象本身有明确类型。

1. 数值类型(Numeric)

类型 示例 说明
int 42, -7 任意精度整数
float 3.14, -0.001 浮点数(双精度)
complex 3+4j 复数(较少用)
python 复制代码
x = 100          # int
y = 3.14159      # float
z = 2 + 3j       # complex
print(type(x))   # <class 'int'>

💡 注意:10 / 3 返回 float(3.333...),10 // 3 才是整除(3)


2. 字符串(str)------ 不可变序列

python 复制代码
name = "Alice"
msg = 'Hello, World!'
long_text = """多行字符串
可包含换行"""
  • 用单引号 '、双引号 " 或三引号 """ 定义
  • 不可变:修改字符串会创建新对象
  • 支持索引、切片、拼接
python 复制代码
s = "Python"
print(s[0])     # 'P'
print(s[1:4])   # 'yth'
# s[0] = 'J'    # ❌ 报错!str 不可变

3. 列表(list)------ 可变有序序列

python 复制代码
fruits = ["apple", "banana", "cherry"]
numbers = [1, 2, 3, 4]
mixed = [1, "hello", True, [1, 2]]
  • 用方括号 [] 定义
  • 可变:可增删改元素
  • 支持嵌套、切片、方法(.append(), .pop() 等)
python 复制代码
fruits.append("orange")
fruits[0] = "pear"  # ✅ 允许修改

4. 元组(tuple)------ 不可变有序序列

python 复制代码
point = (10, 20)
rgb = (255, 128, 0)
single = (42,)      # 单元素元组需加逗号!
  • 用圆括号 () 定义(实际靠逗号区分)
  • 不可变:一旦创建不能修改
  • 常用于函数返回多个值、字典键(因不可变)
python 复制代码
def get_name_age():
    return "Bob", 25  # 实际返回 tuple

name, age = get_name_age()

5. 字典(dict)------ 键值对映射

python 复制代码
person = {
    "name": "Alice",
    "age": 30,
    "city": "Beijing"
}
  • 用花括号 {} 定义
  • 可变
  • 键必须是不可变类型(str, int, tuple),值可以是任意类型
python 复制代码
person["email"] = "alice@example.com"  # 新增
print(person["name"])                   # 访问

6. 集合(set)------ 无序不重复元素集

python 复制代码
unique_ids = {1, 2, 3, 3, 2}  # 自动去重 → {1, 2, 3}
letters = set("hello")        # {'h', 'e', 'l', 'o'}
  • 用花括号 {}set() 创建
  • 可变
  • 支持数学运算:并集 |、交集 &、差集 -
python 复制代码
a = {1, 2, 3}
b = {3, 4, 5}
print(a & b)  # {3}

四、可变 vs 不可变对象:关键区别

类型 是否可变 常见代表
不可变 ❌ 创建后不能修改 int, float, str, tuple
可变 ✅ 可原地修改 list, dict, set

为什么重要?看这个经典例子:

python 复制代码
# 不可变对象
a = 10
b = a
a = 20
print(b)  # 10 → b 不受影响

# 可变对象
list1 = [1, 2, 3]
list2 = list1
list1.append(4)
print(list2)  # [1, 2, 3, 4] → list2 被"意外"修改!

💡 解决方案:需要副本时,用 .copy()copy.deepcopy()

python 复制代码
list2 = list1.copy()  # 浅拷贝

五、深入内存:id()is==

  • id(obj):返回对象的内存地址
  • is:比较两个变量是否指向同一个对象
  • ==:比较两个对象的值是否相等
python 复制代码
a = [1, 2, 3]
b = [1, 2, 3]
print(a == b)   # True(值相等)
print(a is b)   # False(不同对象)

c = a
print(a is c)   # True(同一对象)

⚠️ 特别注意小整数缓存:

python 复制代码
x = 256
y = 256
print(x is y)  # True(CPython 缓存 -5~256)

x = 257
y = 257
print(x is y)  # 可能 False(取决于环境)

六、变量命名最佳实践

  1. 遵循 PEP8snake_case(如 user_name

  2. 见名知意 :避免 a, tmp,改用 total_price, is_valid

  3. 不要覆盖内置 :避免 list = [...]str = "hello"

  4. 类型提示(Python 3.5+) 提升可读性:

    python 复制代码
    def greet(name: str) -> str:
        return f"Hello, {name}!"

七、常见误区与避坑指南

❌ 误区 1:"变量有类型"

  • 正确理解:对象有类型,变量只是引用
  • a = 10a = "hello" 完全合法

❌ 误区 2:"元组完全不可变"

  • 元组本身不可变,但若包含可变对象,其内容可变:

    python 复制代码
    t = ([1, 2], "hello")
    t[0].append(3)  # ✅ 允许!t 变成 ([1,2,3], "hello")

❌ 误区 3:用 == 判断 None

  • 正确做法:用 is

    python 复制代码
    if value is None:  # ✅ 推荐
    if value == None:  # ❌ 不推荐(可能被重载)

八、总结速查表

数据类型 符号 可变? 有序? 允许重复? 典型用途
int/float --- --- --- 数值计算
str "..." 文本处理
list [...] 动态数组
tuple (...) 固定结构、返回值
dict {...} ✅(3.7+) 键唯一 映射关系
set {...} 去重、集合运算

九、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

相关推荐
前端达人1 小时前
你的App消息推送为什么石沉大海?看Service Worker源码我终于懂了
java·开发语言
汤姆yu1 小时前
基于springboot的电子政务服务管理系统
开发语言·python
全栈师1 小时前
C#中控制权限的逻辑写法
开发语言·c#
S***q1922 小时前
Rust在系统工具中的内存安全给代码上了三道保险锁。但正是这种“编译期的严苛”,换来了运行时的安心。比如这段代码:
开发语言·后端·rust
执笔论英雄2 小时前
【RL】python协程
java·网络·人工智能·python·设计模式
打点计时器2 小时前
matlab 解决wfdb工具使用本地数据集报错
开发语言·matlab
zmzb01032 小时前
C++课后习题训练记录Day38
开发语言·c++
夏霞2 小时前
c# 使用vs code 创建.net8.0以及.net6.0 webApi项目的教程
开发语言·c#·.net
T***u3332 小时前
Rust在Web中的 Web框架
开发语言·后端·rust