python中关键字参数值的命名空间是什么?

库科23

我知道自从我发现python以来,python就以不同的方式对待这个名称空间

def foo(l=[]):
    l.append(1)
    print(l)

foo()
foo()
foo([])
foo()

打印以下内容。

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

因此,我对它们用作对象初始化器表示怀疑。然后最近我遇到了另一个类似的奇怪行为,如下所示。

class Foo:
    bar = 0
    def __init__(self):
        self.a = bar
Foo()

这就引发了一个异常,该异常bar未在此命名空间内定义。

class Foo:
   bar = 0
   def __init__(self, a=bar)
       self.a = a
Foo()

现在,这成功地将由类变量保存的值分配给初始化程序内部的foo对象a为什么会发生这些情况以及如何处理默认参数值?

威姆

三个事实:

  1. 默认参数名称(左侧)是函数体内的局部变量名称。
  2. 在定义函数时,将在定义函数的范围内评估默认参数(右侧)。
  3. 在类定义期间,将在临时名称空间中执行类块中的代码。不能将class块视为封闭范围,如果您期望行为类似于nested,这可能会令人惊讶def

第三点是最微妙的,也许与最初的期望相反。它记录在执行模型中(第4.2.2。“名称解析”):

在类块中定义的名称范围仅限于该类块。它不会扩展到方法的代码块

这就是为什么bar在第二个示例中不解析名称的原因

class Foo:
    bar = 0
    def __init__(self):
        self.a = bar  # name "bar" isn't accessible here, but code is valid syntax

Foo()  # NameError: name 'bar' is not defined

请注意,仍然可以从方法中将barvalue0用作类属性:通过Foo.barself.bar

你现在应该明白为什么最后一个例子的工作:

class Foo:
   bar = 0
   def __init__(self, a=bar):
       self.a = a
Foo()

并且,考虑到上面的1-3点,您还应该能够正确预测此处发生的情况:

class Foo:
   def __init__(self, a=bar):
       self.a = a
   bar = 0
Foo()

UnboundLocalError中有关于奇怪的类作用域的更多信息:赋值之前引用局部变量,为什么在这种情况下不应用LEGB规则

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在python函数调用中混合关键字参数和*元组的规则是什么

来自分类Dev

Oracle中的“ THE”关键字是什么?

来自分类Dev

函数参数前的class关键字是什么?

来自分类Dev

方法参数中具有final关键字的目的是什么?

来自分类Dev

为什么在Python中的关键字参数之前需要指定位置参数?

来自分类Dev

Swift中的“ required”关键字是什么意思?

来自分类常见问题

Java中default关键字的目的是什么?

来自分类Dev

Go中的5个秘密关键字是什么?

来自分类Dev

PowerShell中的“ alias”关键字是什么?

来自分类Dev

Spider中的“ extends”关键字是什么?

来自分类Dev

R中SQL的IN关键字的等效项是什么?

来自分类常见问题

类中函数之前的“ get”关键字是什么?

来自分类Dev

MSVC中的“ interface”关键字是什么?

来自分类Dev

ALSO关键字在MLISP中是什么意思?

来自分类Dev

Java的“ .addActionListener(this)”中“ this”关键字指的是什么

来自分类Dev

Kotlin中的“ external”关键字的目的是什么?

来自分类Dev

Haskell中LANGUAGE关键字的目的是什么?

来自分类Dev

“和”关键字在OCaml中是什么意思?

来自分类Dev

Kotlin中“ let”关键字的目的是什么

来自分类Dev

InstancedBufferGeometry中的关键字属性列表是什么?

来自分类Dev

打字稿中“ as”关键字的目的是什么?

来自分类Dev

Java的“ .addActionListener(this)”中的“ this”关键字指的是什么

来自分类Dev

SQL Server中的“ message”关键字是什么?

来自分类Dev

代码块 IDE 中的“用户关键字”是什么?

来自分类Dev

Swift 中重复使用的关键字是什么?

来自分类Dev

新关键字是什么?

来自分类Dev

“ where”关键字的含义是什么?

来自分类Dev

扩展:finally关键字是什么?

来自分类Dev

新关键字是什么?

Related 相关文章

  1. 1

    在python函数调用中混合关键字参数和*元组的规则是什么

  2. 2

    Oracle中的“ THE”关键字是什么?

  3. 3

    函数参数前的class关键字是什么?

  4. 4

    方法参数中具有final关键字的目的是什么?

  5. 5

    为什么在Python中的关键字参数之前需要指定位置参数?

  6. 6

    Swift中的“ required”关键字是什么意思?

  7. 7

    Java中default关键字的目的是什么?

  8. 8

    Go中的5个秘密关键字是什么?

  9. 9

    PowerShell中的“ alias”关键字是什么?

  10. 10

    Spider中的“ extends”关键字是什么?

  11. 11

    R中SQL的IN关键字的等效项是什么?

  12. 12

    类中函数之前的“ get”关键字是什么?

  13. 13

    MSVC中的“ interface”关键字是什么?

  14. 14

    ALSO关键字在MLISP中是什么意思?

  15. 15

    Java的“ .addActionListener(this)”中“ this”关键字指的是什么

  16. 16

    Kotlin中的“ external”关键字的目的是什么?

  17. 17

    Haskell中LANGUAGE关键字的目的是什么?

  18. 18

    “和”关键字在OCaml中是什么意思?

  19. 19

    Kotlin中“ let”关键字的目的是什么

  20. 20

    InstancedBufferGeometry中的关键字属性列表是什么?

  21. 21

    打字稿中“ as”关键字的目的是什么?

  22. 22

    Java的“ .addActionListener(this)”中的“ this”关键字指的是什么

  23. 23

    SQL Server中的“ message”关键字是什么?

  24. 24

    代码块 IDE 中的“用户关键字”是什么?

  25. 25

    Swift 中重复使用的关键字是什么?

  26. 26

    新关键字是什么?

  27. 27

    “ where”关键字的含义是什么?

  28. 28

    扩展:finally关键字是什么?

  29. 29

    新关键字是什么?

热门标签

归档