You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何局部作用域可修改全局参数?为何aaa无法修改而bbb可以?

Python全局变量修改问题解答

问题1:为何局部作用域中的操作可以修改全局参数?

核心原因是Python对可变对象和不可变对象的处理逻辑完全不同:

  • 不可变对象(如int、str、tuple):本身无法被修改,任何看似“修改”的操作本质都是创建新对象,再让变量指向这个新对象。
  • 可变对象(如list、dict、set):本身支持内部元素/属性的修改,无需重新给变量赋值就能改变对象本身。

当局部作用域中没有重新给全局变量赋值时:如果全局变量指向可变对象,对该对象的修改会直接作用在全局的那个对象上;如果是不可变对象,直接赋值会创建局部变量,不会影响全局变量。

问题2:示例代码中全局变量aaa无法修改,bbb却可以修改的原因

先看示例代码:

aaa = 100
def plus():
    aaa = 8   #aaa=8

plus()
print(f"aaa = {aaa}")   #aaa = 100



bbb = [100,8]
def plus2():
    bbb[0] = 5   #bbb=[5, 8]

plus2()
print(f"bbb = {bbb}")   #bbb = [5, 8]

关于aaa的解释

aaa是不可变的int类型:

  • 全局作用域中aaa = 100让变量aaa指向值为100的int对象。
  • 在plus()函数里,aaa = 8是赋值操作,Python会在局部作用域创建一个新的局部变量aaa,让它指向值为8的int对象——这个局部变量和全局的aaa完全无关,所以全局的aaa不会被改变。

如果要在函数内修改全局的aaa,需要用global声明:

aaa = 100
def plus():
    global aaa
    aaa = 8

plus()
print(f"aaa = {aaa}")  # 输出 aaa = 8

关于bbb的解释

bbb是可变的list类型:

  • 全局作用域中bbb = [100,8]让变量bbb指向一个列表对象。
  • 在plus2()函数里,bbb[0] = 5不是给bbb重新赋值,而是直接修改这个列表对象内部的元素——Python会找到bbb指向的全局列表对象,修改它的第一个元素值,所以全局的bbb指向的列表对象被直接改变,打印时能看到变化。

内容的提问来源于stack exchange,提问作者You Tube

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 07:15:34