Python 变量和数据类型

Python 3.13

很多教程把变量说成「装数据的盒子」,这个比喻在 Python 里会误导人。Python 的变量更像是贴在对象上的标签:对象先存在,变量只是指向它的名字。

变量是名字绑定

a = [1, 2, 3]
b = a
b.append(4)
print(a)  # [1, 2, 3, 4]

b = a 并没有复制列表,而是让 b 和 a 指向同一个列表对象。所以通过 b 做的修改,通过 a 也能看到。理解这一点,后面讨论可变类型就不再困难。

可以用 id() 观察两个变量是否指向同一对象:

a = [1, 2, 3]
b = a
print(a is b)   # True,同一个对象
print(id(a) == id(b))  # True

注意 is 比较的是「是不是同一个对象」,而 == 比较的是「值是否相等」。判断值相等一律用 ==。

常用内置类型

类型 例子 是否可变
int 42 不可变
float 3.14 不可变
str "hello" 不可变
bool True 不可变
list [1, 2] 可变
tuple (1, 2) 不可变
dict {"a": 1} 可变
set {1, 2} 可变
NoneType None 不可变

类型不需要声明,但可以用 type() 查看:

print(type(42))        # <class 'int'>
print(type("hello"))   # <class 'str'>
print(type([1, 2]))    # <class 'list'>

可变与不可变的区别

不可变类型上的「修改」其实是创建新对象:

s = "hello"
s = s + " world"   # 生成新字符串,原字符串没有变

可变类型则是原地修改:

nums = [1, 2]
nums.append(3)     # 原地修改,nums 还是同一个对象

这带来一个实用结论:把可变对象传给函数,函数内部的修改会影响外部;不可变对象不会。

三个常见误区

  1. 浮点精度:0.1 + 0.2 == 0.3 结果是 False,这是二进制浮点的固有特性。需要精确十进制时用 decimal.Decimal。
  2. is 比较字符串或数字:小整数和短字符串会被缓存复用,is 偶尔“碰巧”为 True,不能用来判断相等。
  3. 布尔是整数的子类:True + True 等于 2。判断真假用 if x: 而不是 if x == True:。

命名约定

变量名用小写加下划线(user_name),常量用全大写(MAX_RETRY),不要用单个字母 l、O、I(容易和数字混淆)。避免使用 list、dict、str 等内置名做变量名,否则会遮蔽内置类型。

小结

  • 变量是名字绑定,不是盒子。
  • 判断相等用 ==,判断同一对象用 is。
  • 改动是否“传出去”,取决于对象是可变还是不可变。

下一步