Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 函数是否跟踪其内部变量?_Python_Variables_Scope - Fatal编程技术网

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包含的内容。