Python 函数是否跟踪其内部变量?
我对函数变量的作用域有点困惑,有时函数会跟踪它的局部变量,因此如果再次调用它,它会调用以前的变量值,而其他时候它不会跟踪这些值 在下面的代码中,函数跟踪Python 函数是否跟踪其内部变量?,python,variables,scope,Python,Variables,Scope,我对函数变量的作用域有点困惑,有时函数会跟踪它的局部变量,因此如果再次调用它,它会调用以前的变量值,而其他时候它不会跟踪这些值 在下面的代码中,函数跟踪mylist,并在每次调用时附加到它 def test(mylist=[]): mylist.append(1) print (mylist) test() test() test() 输出: [1] [1, 1] [1, 1, 1] 1 1 1 在下面的代码中,x在每次调用函数时都设置为零 def test(x=0):
mylist
,并在每次调用时附加到它
def test(mylist=[]):
mylist.append(1)
print (mylist)
test()
test()
test()
输出:
[1]
[1, 1]
[1, 1, 1]
1
1
1
在下面的代码中,x
在每次调用函数时都设置为零
def test(x=0):
x+=1
print (x)
test()
test()
test()
输出:
[1]
[1, 1]
[1, 1, 1]
1
1
1
这种行为的解释是什么
还有,有没有办法从外部查看函数内部变量的当前值
[更新]
经过评论,我现在明白了为什么
mylist
会被更新,但是第二种情况下x
会怎样呢?为什么没有更新?是因为x
是不可变的,而mylist
是可变的吗?函数调用之间保留的不是mylist
,而是默认值[]
,它是一个匿名数组,每次都通过引用mylist
指定
附加到mylist
当然会附加到它所引用的数组
在第一种情况下,x包含对数组的引用,当您“添加到x”时,您将修改该数组。 在第二种情况下,x只包含一个数字
0
,当您“添加到x”时,您将更改x包含的内容
关键的一点是,默认参数值的表达式只计算一次,并在函数调用之间重复使用
欢迎使用Python:-(函数不跟踪从一个调用到下一个调用的值。第一个调用中出现的是默认参数的怪癖,强烈建议避免使用这些参数,除非@0x5453的链接中有很好的理由。那么,为什么在第二种情况下不更新x呢?在第一种情况下,x包含对数组的引用,并且“添加到x”可以修改该数组。在第二种情况下,x只包含一个数字
0
,当您“添加到x”时,可以更改x包含的内容。