为何局部作用域可修改全局参数?为何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
相关产品推荐
相关产品推荐

