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

