Python中同为全局变量的int类型与list类型为何表现不一致?
核心原因是Python的作用域规则 + 可变/不可变对象的操作差异
- 首先明确Python对全局变量的访问规则:如果函数内部尝试对变量做赋值类操作(包括
=、+=、-=等重新绑定变量指向的操作),Python会默认将该变量识别为局部变量,不会自动去全局作用域查找。 - 第一种情况中的
x是整数类型,属于不可变对象:x += n本质等价于x = x + n,属于赋值操作,Python会把这里的x判定为局部变量。但赋值语句右侧需要先读取x的值,此时局部x还未完成定义,因此抛出local variable 'x' referenced before assignment错误。
如果要操作全局的x,需要在函数开头加global x声明,明确告知Python该变量使用全局作用域的定义即可正常运行。 - 第二种情况中的
fi是列表类型,属于可变对象:
整个函数内部没有对fi本身做赋值操作,只是调用fi.append()方法修改列表内部的元素,属于对可变对象的原地修改,没有改变fi变量本身的指向。因此Python找不到局部定义的fi时,会自动到全局作用域查找已定义的fi列表,因此可以正常运行。
如果在函数中尝试对fi本身赋值(比如写fi = [1,2,3]),同样会触发和第一种情况一样的报错,此时如果要修改全局的fi变量也需要加global fi声明。
内容的提问来源于stack exchange,提问作者confusing anonymous
相关产品推荐
相关产品推荐

