Python中的变量与数据类型

部署运行你感兴趣的模型镜像

一、前言

“变量是什么?”
这是每个编程新手都会问的问题。
而在 Python 中,变量的概念既简单又微妙——它不像 C 或 Java 那样需要声明类型,却暗藏“对象引用”的玄机。

本文将带你: ✅ 理解 Python 变量的本质(不是“盒子”,而是“标签”)
✅ 掌握 6 大核心数据类型及其使用场景
✅ 区分“可变”与“不可变”对象,避免踩坑
✅ 用 id()is 深入理解内存机制
✅ 养成良好的变量命名与使用习惯


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

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

对比传统语言(如 C):

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

关键理解
Python 的变量 = 名字 + 引用(指针),真正的数据是“对象”。


三、Python 六大核心数据类型

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

1. 数值类型(Numeric)

类型示例说明
int42-7任意精度整数
float3.14-0.001浮点数(双精度)
complex3+4j复数(较少用)
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)—— 不可变序列

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

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

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

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

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

name, age = get_name_age()

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

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

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

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

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

类型是否可变常见代表
不可变❌ 创建后不能修改intfloatstrtuple
可变✅ 可原地修改listdictset

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

# 不可变对象
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()

list2 = list1.copy()  # 浅拷贝

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

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

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

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

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. 见名知意:避免 atmp,改用 total_priceis_valid
  3. 不要覆盖内置:避免 list = [...]str = "hello"
  4. 类型提示(Python 3.5+) 提升可读性:
    def greet(name: str) -> str:
        return f"Hello, {name}!"

七、常见误区与避坑指南

❌ 误区 1:“变量有类型”

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

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

  • 元组本身不可变,但若包含可变对象,其内容可变:
    t = ([1, 2], "hello")
    t[0].append(3)  # ✅ 允许!t 变成 ([1,2,3], "hello")

❌ 误区 3:用 == 判断 None

  • 正确做法:用 is
    if value is None:  # ✅ 推荐
    if value == None:  # ❌ 不推荐(可能被重载)

八、总结速查表

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

九、结语

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

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值