首页 > 解决方案 > 函数是否跟踪其内部变量?

问题描述

我对函数变量范围有点困惑,有时函数会跟踪其局部变量,因此如果再次调用它,它会调用变量的先前值 - 有时它不会跟踪值。

在下面的代码中,函数会在每次调用时跟踪mylist并附加到它。

def test(mylist=[]):
    mylist.append(1)
    print (mylist)

test()
test()
test()

输出:

[1]
[1, 1]
[1, 1, 1]

而在下面的代码中,x每次调用函数时都将其设置为零。

def test(x=0):
    x+=1
    print (x)

test()
test()
test()

输出:

1
1
1

这种行为的解释是什么?

另外,有没有办法从外部查看函数内部变量的当前值?

[更新]

评论后,我现在明白为什么mylist要更新了,但是x在第二种情况下呢?为什么不更新?是因为x不可变而mylist可变吗?

标签: pythonvariablesscope

解决方案


它不是mylist在函数调用之间保留的,而是默认值,它是一个单个匿名数组,每次都[]通过引用分配。mylist

附加到mylist当然附加到它所引用的数组。

在第一种情况下,x 包含对数组的引用,当您“添加到 x”时,您修改了该数组。在第二种情况下,x 只包含一个数字0,当您“添加到 x”时,您更改了 x 包含的内容。

关键是默认参数值的表达式只计算一次,并在函数调用之间重复使用。

欢迎来到 Python :-(


推荐阅读