为什么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)

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


回答:

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

你的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

以上是 为什么python函数内部能够修改外部的列表值,但是无法修改外部的变量值? 的全部内容, 来源链接: utcz.com/p/938404.html

回到顶部