python - 函数是否跟踪其内部变量?
问题描述
我对函数变量范围有点困惑,有时函数会跟踪其局部变量,因此如果再次调用它,它会调用变量的先前值 - 有时它不会跟踪值。
在下面的代码中,函数会在每次调用时跟踪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
可变吗?
解决方案
它不是mylist
在函数调用之间保留的,而是默认值,它是一个单个匿名数组,每次都[]
通过引用分配。mylist
附加到mylist
当然附加到它所引用的数组。
在第一种情况下,x 包含对数组的引用,当您“添加到 x”时,您修改了该数组。在第二种情况下,x 只包含一个数字0
,当您“添加到 x”时,您更改了 x 包含的内容。
关键是默认参数值的表达式只计算一次,并在函数调用之间重复使用。
欢迎来到 Python :-(
推荐阅读
- angular - ngx-bootstrap 正确的分页方式
- javascript - 如何在某个 URL 上执行功能
- javascript - 在 React 中选择产品后如何显示结果
- common-lisp - 如何在 common-lisp CLOS 中指向一个 defgeneric 实例
- regex - 匹配特定标签之间的字符串并转换为维基链接
- r - 使用 ggplot 绘制游戏
- sql - 如何简化 sql 查询?
- javascript - 无法将 JSON 的对象转换为 Angular 7 中的键/值对
- php - 在 php 中发送标头的正确逻辑是什么?
- c# - 配置生成器 - 无法加载程序集 - .Net Framework