1. 变量是什么? #

a = 10
a = "hello"   # 标签改指向新对象,不是把 10 改成字符串

2. 命名规则 #

规则 说明
字符 字母、数字、下划线
开头 不能以数字开头
关键字 不能用 if、class 等保留字
user_name = "Alice"      # 推荐
max_retry_count = 3

# userName = "Alice"     # 变量不推荐驼峰(类名才用)

3. 常用赋值 #

# 元组解包
name, age = "Bob", 25

# 交换变量
x, y = 10, 20
x, y = y, x

3.1 链式赋值的陷阱 #

a = b = []
a.append(1)
print(b)   # [1] —— b 也被改了

# 正确:分别创建
a, b = [], []

4. is 与 == #

运算符 比较的是
== 值是否相等
is 是否是同一个对象(同一内存)
a = [1, 2, 3]
b = [1, 2, 3]
c = a

print(a == b)   # True,内容相同
print(a is b)   # False,两个列表对象
print(a is c)   # True,同一对象

value = None
if value is None:    # 判断 None 用 is
    print("value 是 None")

5. 可变对象 vs 不可变对象 #

类型 分类 修改时
int、float、str、tuple 不可变 生成新对象
list、dict、set 可变 原地修改,id 不变
# 不可变:赋值产生新对象
s = "hi"
s += "!"       # 新字符串
print(s)       # hi!

# 可变:原地修改
lst = [1, 2, 3]
lst.append(4)  # 仍是同一个列表对象
print(lst)     # [1, 2, 3, 4]

lst2 = lst
lst.append(5)
print(lst2)    # [1, 2, 3, 4, 5] —— 共享引用,一并变化

6. 浅拷贝和深拷贝 #

import copy

list1 = [1, 2, [3, 4]]
shallow_copy = copy.copy(list1)
print('原始list1:', list1)
print('浅拷贝shallow_copy:', shallow_copy)
# 修改嵌套元素
list1[2][0] = 99
print('修改list1[2][0]为99后')
print('list1:', list1)
print('shallow_copy:', shallow_copy)  # 嵌套部分也会变化

list2 = [1, 2, [3, 4]]
deep_copy = copy.deepcopy(list2)
print('原始list2:', list2)
print('深拷贝deep_copy:', deep_copy)
# 修改嵌套元素
list2[2][0] = 88
print('修改list2[2][0]为88后')
print('list2:', list2)
print('deep_copy:', deep_copy)  # 不会变化

7. 函数中的常见陷阱 #

7.1 传递可变对象 #

def add_item(items):
    """
    向传入的列表中添加一个元素99。
    注意:此操作会修改原列表。
    """
    items.append(99)      # 外部列表会变

def reset(items):
    """
    清空传入的列表。
    注意:此操作会修改原列表,使其为空列表。
    """
    items.clear()         # 外部列表会被清空

my_list = [1, 2, 3]
print("原列表:", my_list)
add_item(my_list)
print("添加99后:", my_list)
reset(my_list)
print("重置后:", my_list)

7.2 可变默认参数(高频 bug) #

# 错误:默认列表只创建一次,多次调用会累积
def add(x, lst=[]):
    lst.append(x)
    return lst

print(add(1))   # 输出: [1]
print(add(2))   # 输出: [1, 2] 这是一个错误

# 正确
def add_fixed(x, lst=None):
    if lst is None:
        lst = []
    lst.append(x)
    return lst

print(add_fixed(1))   # 输出: [1]
print(add_fixed(2))   # 输出: [2]

8. 项目开发要点 #