为什么python函数内部能够修改外部的列表值,但是无法修改外部的变量值?

cnt=1000
def foo():
    print("foo函数内",cnt)
foo()
print("foo函数后",cnt)
def foo1():
    cnt=0 #为什么此处函数内,不能修改外部的变量cnt?
    cnt=cnt+1
    print("foo1函数内",cnt)
foo1()
print("foo1函数后",cnt)

#######
l=[0]
def foo2():
    print("foo2函数内",l)
foo2()
print("foo2函数后",cnt)
def foo3():
    l[0]="*"#为什么此处函数内可以修改外部的列表l?
    print("foo3函数内",l)
foo3()
print("foo3函数后",l)

image.png

阅读 5.1k
3 个回答

你这里是局部变量和全局变量。

你的foo是直接引用全局变量cnt
你foo3中你缺少1定义过程,所以实质是直接引用了全局变量l来进行修改,所以变动了全局变量。

如果你按下面定义foo3,就不能影响全局变量l

list=[0]
def foo3():
    list=[1] 
    list[0]="*"
    print("foo3函数内",list)

foo3()
print("foo3函数后",list)

Python 的变量分可变和不可变

可变:

  • list
  • set
  • dict

不可变:

  • int
  • float
  • tuple
  • str

对于不可变变量,作为参数的时候,会被复制一份,可以看做是值传递

对于可变变量,作为参数的时候,可以看做是引用传递

python 没有专门的变量定义语句,很多时候是靠赋值操作来定义变量的。只要在一个函数内存在对一个标识符的赋值操作,那么就会定义函数内部的变量。

如果整个函数里没有对标识符的赋值操作,那么就不会有函数级的变量存在。此时,如果有对这个标识符的引用,那么就会找到外层的(比如全局的)变量。

所以,foo1 的 cnt = 1 定义了一个局部变量,于是函数内所有对 cnt 的操作都是对局部变量进行的,不会影响全局的 cnt

但是,foo3 中没有类似操作,所以不存在一个 l 的局部变量。 l[0] = ... 中的 l ,引用的是全局的 l

Naming and binding

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏