【问题标题】:Do functions keep track of their inner variables? [duplicate]函数是否跟踪其内部变量? [复制]
【发布时间】:2021-05-07 12:21:24
【问题描述】:

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

在以下代码中,该函数跟踪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

这种行为的解释是什么?

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

[更新]

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

【问题讨论】:

  • 函数不会跟踪从一个调用到下一个调用的值。第一个中发生的事情是默认参数的怪癖,强烈建议避免使用,除非你有充分的理由,根据@0x5453 的链接。

标签: python variables scope


【解决方案1】:

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

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

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

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

欢迎来到 Python :-(

【讨论】:

  • 那么,为什么第二种情况下x没有更新呢?
  • 在第一种情况下,x 包含对数组的引用,当您“添加到 x”时,您修改了 that 数组。在第二种情况下,x 只包含一个数字0,当您“添加到 x”时,您更改了 x 包含的内容。
猜你喜欢
  • 2018-07-25
  • 1970-01-01
  • 1970-01-01
  • 2013-05-25
  • 1970-01-01
  • 2011-08-22
  • 2017-02-25
  • 1970-01-01
  • 2018-10-20
相关资源
最近更新 更多