当前位置:首页>python>100 天精通 Python(基础篇)——第 9 天:变量进阶(引用、拷贝、作用域、全局与非局部)

100 天精通 Python(基础篇)——第 9 天:变量进阶(引用、拷贝、作用域、全局与非局部)

  • 2026-09-02 19:03:19
100 天精通 Python(基础篇)——第 9 天:变量进阶(引用、拷贝、作用域、全局与非局部)

大家好,欢迎来到 100 天精通 Python 打卡第 9 天!

前面我们已经学会了基础变量、高级变量、函数、综合项目,今天进入变量底层逻辑。

这一章是新手最容易踩坑的地方,也是面试高频考点,彻底搞懂后,写代码会少很多莫名其妙的 Bug。


一、变量本质:不是盒子,而是标签

在 Python 中:

  • 变量不是装数据的盒子
  • 变量是贴在数据上的标签(引用)
a = 10b = a

并不是把 10 复制给 b,而是让 b 也指向同一个数据对象。


二、可变类型 vs 不可变类型

1. 不可变类型

创建后不能修改原值,修改会生成新对象

  • int / float / str / bool / tuple
    a = "hello"a = "world"   # 不是修改原字符串,而是新建字符串

2. 可变类型

可以直接在原对象上修改

  • list / dict / set
    lst = [1,2,3]lst.append(4)  # 直接修改原列表

三、赋值、浅拷贝、深拷贝(超级重点)

1. 直接赋值:只是贴标签

a = [1,2,3]b = ab.append(4)print(a)   # [1,2,3,4]  a也变了!

因为 a 和 b 指向同一个列表。


2. 浅拷贝 copy ()

只拷贝第一层,嵌套的可变类型仍然共用

a = [1,2,[3,4]]b = a.copy()b[0] = 999print(a)   # [1,2,[3,4]]  第一层不受影响b[2].append(5)print(a)   # [1,2,[3,4,5]] 嵌套列表被改了

3. 深拷贝 deepcopy

完全独立复制,彻底无关

import copya = [1,2,[3,4]]b = copy.deepcopy(a)b[2].append(5)print(a)   # [1,2,[3,4]]  完全不变

四、变量作用域

1. 局部作用域

函数内部定义,只能内部用

def func():    x = 10   # 局部变量func()# print(x) 报错

2. 全局作用域

文件顶层定义,整个文件可用

x = 100def func():    print(x)

五、global 关键字

在函数内部修改全局变量必须声明 global

count = 0def add():    global count    count += 1add()print(count)  # 1

六、nonlocal 关键字

用于嵌套函数中修改外层函数变量(闭包常用)

def outer():    num = 10    def inner():        nonlocal num        num += 1    inner()    print(num)  # 11

七、函数参数传递规则

  • 不可变类型: 类似值传递,函数内改不影响外面
  • 可变类型: 类似引用传递,函数内改会影响外面
def func(lst):    lst.append(4)a = [1,2,3]func(a)print(a)  # [1,2,3,4]

八、高级小知识点

1. 身份判断 is vs ==

  • == 比较值是否相等
  • is 比较内存地址是否同一个对象
a = [1,2]b = [1,2]print(a == b)  # Trueprint(a is b)  # False

2. id () 查看内存地址

a = 10print(id(a))

3. 小整数池

Python 对 -5 ~ 256 整数做了缓存,共用对象:

a = 10b = 10print(a is b)  # True

九、今日高频易错点总结

  1. 列表赋值会互相影响,要用 copy /deepcopy
  2. 函数内改全局变量必须加 global
  3. 嵌套函数改外层变量用 nonlocal
  4. 可变类型传参容易 “意外修改” 原数据
  5. is 判断同一个对象,== 判断值相同

最新文章

随机文章