当我在函数中重新分配可变默认参数时会发生什么?

尔简

我知道这已经在高度活跃的“最少惊讶”问题中得到了回答,我稍微修改了代码段,但仍然不明白为什么它会生成新的空列表并向其添加1。

def foo(var=[]):
    if len(var) == 0:
        var = []
    print(var)
    var.append(1)
    return var

print(foo())
print(foo())

输出:

[]
[1]
[]
[1]

我对这个python片段的预期逻辑:

  • 在foo()的第一次调用中,var初始化为空列表,并且实际上-根据foo ONCE的定义进行求值-作为流行问题的答案。

  • 该if子句检查根本不应该输入-因为var仅初始化一次,所以在第二次调用foo()时,应简单地跳过它,并将1加到var = [1],从而使结果[1,1]在第二通电话。

但是它仍然每次都会将if子句和init var转到[]。为什么?

但是,如果删除if子句:

def foo(var=[]):

    print(var)
    var.append(1)
    return var


print(foo())
print(foo())

每次都会在var后面附加“ 1”,并且var增长:

[1]

[1,1]

因此,输入了if子句并检查其有效性..对执行感到困惑。

cs95

让我们重写您的示例,以便我们在重新分配参数之前对参数进行一些更改:

In [262]: def foo(var=[]): 
     ...:     var.append(1)   # 1
     ...:     print(var)      # 2
     ...:     var = []        # 3
     ...:     return var      # 4
     ...:                                                                            

In [263]: foo()                                                                      
[1]
Out[263]: []

In [264]: foo()                                                                      
[1, 1]  # reflects the append from the previous call
Out[264]: []

第1行中的append步骤会更改默认参数列表。第3行中的重新分配步骤只是将变量重新分配var到一个新列表(一个完全不同的对象),这就是您返回的内容。

您会看到随后的每个调用都修改了默认参数列表,它仍然存在,但您只是看不到它,因为重新分配时会丢失对它的引用。

我建议阅读Ned Batchelder的这篇文章

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

当我在Bash脚本中对函数使用`&`时会发生什么?

来自分类Dev

Java将数组参数分配给构造函数中的成员时会发生什么?

来自分类Dev

MySql-当我用“ and”更新时会发生什么

来自分类Dev

当我放弃对iOS 6的支持时会发生什么?

来自分类Dev

当我释放Delphi中可能不存在的内存时会发生什么?

来自分类Dev

当我在异步回调中设置对象时会发生什么?

来自分类Dev

当我绑定到AliasProperty时会发生什么?

来自分类Dev

当我使用多个模拟时间时会发生什么?

来自分类Dev

当我多次调用requestAnimationFrame时会发生什么

来自分类Dev

重新分配尚未准备好的未来时会发生什么

来自分类Dev

当我调用“ BufferStrategy.show()”时会发生什么?

来自分类Dev

当我们在Android Studio中添加DEPENDENCY时会发生什么

来自分类Dev

重新分配向量后,向量中的内存会发生什么情况

来自分类Dev

当我放弃对iOS 6的支持时会发生什么?

来自分类Dev

当我从静态ArrayList中获取一个对象并更改其参数时会发生什么?

来自分类Dev

当我们将参数传递给System.out.println()时会发生什么?

来自分类Dev

当我截断正在使用的文件时会发生什么?

来自分类Dev

当我用`-e`参数回显时会发生什么?

来自分类Dev

当我们重新加载Elixir模块时会发生什么?

来自分类Dev

当我将%esp移至%ebp时会发生什么?

来自分类Dev

当我不输入期望的命令时会发生什么?

来自分类Dev

当我忘记登录TTY时会发生什么?

来自分类Dev

当我使用多个模拟时间时会发生什么?

来自分类Dev

当我调用“ BufferStrategy.show()”时会发生什么?

来自分类Dev

当我通过 systemctl 或 init 重新启动服务时会发生什么

来自分类Dev

在 C# 中重新分配数组时内存会发生什么?

来自分类Dev

当我尝试使用空的默认构造函数创建对象但在 ANSI C++ 中添加括号时会发生什么?

来自分类Dev

当我取消订阅 Observable 链时会发生什么?

来自分类Dev

当我在嵌套的 React 组件中调用作为 props 传递的函数时会发生什么?

Related 相关文章

  1. 1

    当我在Bash脚本中对函数使用`&`时会发生什么?

  2. 2

    Java将数组参数分配给构造函数中的成员时会发生什么?

  3. 3

    MySql-当我用“ and”更新时会发生什么

  4. 4

    当我放弃对iOS 6的支持时会发生什么?

  5. 5

    当我释放Delphi中可能不存在的内存时会发生什么?

  6. 6

    当我在异步回调中设置对象时会发生什么?

  7. 7

    当我绑定到AliasProperty时会发生什么?

  8. 8

    当我使用多个模拟时间时会发生什么?

  9. 9

    当我多次调用requestAnimationFrame时会发生什么

  10. 10

    重新分配尚未准备好的未来时会发生什么

  11. 11

    当我调用“ BufferStrategy.show()”时会发生什么?

  12. 12

    当我们在Android Studio中添加DEPENDENCY时会发生什么

  13. 13

    重新分配向量后,向量中的内存会发生什么情况

  14. 14

    当我放弃对iOS 6的支持时会发生什么?

  15. 15

    当我从静态ArrayList中获取一个对象并更改其参数时会发生什么?

  16. 16

    当我们将参数传递给System.out.println()时会发生什么?

  17. 17

    当我截断正在使用的文件时会发生什么?

  18. 18

    当我用`-e`参数回显时会发生什么?

  19. 19

    当我们重新加载Elixir模块时会发生什么?

  20. 20

    当我将%esp移至%ebp时会发生什么?

  21. 21

    当我不输入期望的命令时会发生什么?

  22. 22

    当我忘记登录TTY时会发生什么?

  23. 23

    当我使用多个模拟时间时会发生什么?

  24. 24

    当我调用“ BufferStrategy.show()”时会发生什么?

  25. 25

    当我通过 systemctl 或 init 重新启动服务时会发生什么

  26. 26

    在 C# 中重新分配数组时内存会发生什么?

  27. 27

    当我尝试使用空的默认构造函数创建对象但在 ANSI C++ 中添加括号时会发生什么?

  28. 28

    当我取消订阅 Observable 链时会发生什么?

  29. 29

    当我在嵌套的 React 组件中调用作为 props 传递的函数时会发生什么?

热门标签

归档