为什么python函数内部能够修改外部的列表值,但是无法修改外部的变量值?
cnt=1000def 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)
回答:
你这里是局部变量和全局变量。
你的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