变量在python中?

来自python doc的local / global / free变量定义:

如果名称被绑定在一个块中,那么它是该块的局部变量 ,除非声明为非局部变量 。 如果名称在模块级绑定,它是一个全局变量 。 (模块代码块的变量是局部变量和全局变量。)如果在代码块中使用了一个变量,但在那里未定义,则它是一个自由变量


代码1:

>>> x = 0
>>> def foo():
...   print(x)
...   print(locals())
... 
>>> foo()
0
{}

代码2:

>>> def bar():
...   x = 1
...   def foo():
...     print(x)
...     print(locals())
...   foo()
... 
>>> bar()
1
{'x':1}

在函数块中调用时,由locals()返回自由变量 ,但不在类块中调用。


Code 1x是一个全局变量 ,它在foo()使用但未定义。
但它不是一个自由变量 ,因为它不是由locals()返回的。
我认为这不是文件所说的。 是否有自由变量的技术定义?


自由变量的定义:已使用,但既不全局也不限制

例如:

  • 代码1中的x不是免费的,因为它是一个全局变量。
  • 代码2中的bar()x不是免费的,因为它是一个绑定变量。
  • xfoo()是免费的。
  • Python由于关闭而做出了区分。 自由变量在当前环境中没有定义,即收集局部变量, 也不是全局变量! 因此它必须在其他地方定义。 这就是关闭的概念。 在代码2中, foo()bar()定义的x关闭。 Python使用词法范围。 这意味着,解释者能够通过查看代码来确定范围。

    例如: xfoo()被称为变量,因为foo()bar()包围,而x被绑定在bar()

    全局范围由Python专门处理。 将全局范围视为最外层的范围是可能的,但这不是因为性能(我认为)。 因此,这是不可能的x免费全球性的

    豁免

    生活并不那么简单。 存在自由的全局变量。 Python文档(执行模型)说:

    全局语句与同一个块中的名称绑定操作具有相同的作用域。 如果最近的自由变量的封闭范围包含全局语句,则自由变量将被视为全局变量。

    >>> x = 42
    >>> def foo():
    ...   global x
    ...   def baz():
    ...     print(x)
    ...     print(locals())
    ...   baz()
    ... 
    >>> foo()
    42
    {}
    

    我自己并不知道。 我们都在这里学习。


    从我所了解的文档来看,自由变量确实有点模棱两可。 有免费的全局变量被视为纯粹的全局变量和词汇绑定的自由变量。 Eli Bendersky的总结在符号表的博客文章中很好:

    不幸的是,Python的核心有一个缩写,最初可能会让读者误解为什么构成“自由”变量。 幸运的是,这是一个非常轻微的混淆,很容易整理。 执行模型参考说:

    如果一个变量在代码块中使用,但在那里没有定义,它是一个自由变量。

    这与正式的定义是一致的。 然而,在源代码中,“free”实际上被用作“词汇绑定的自由变量” (即在封闭范围内发现绑定的变量)的缩写 ,其中“global”用于指所有剩余的空闲变量。 因此,在阅读CPython源代码时,请记住全套自由变量既包含专门标记为“自由”的变量,也包含标记为“全局”的变量。

    因此,为了避免混淆,当我想将在CPython中实际处理的变量称为免费时,我说“词汇绑定”。

    (强调我的)

    使用这种速记的原因可能是因为当你有一个全局的自由变量时,在发送的字节码中确实没有任何变化。 如果一个global变量是'空闲的'或者它不是不会改变这个名字的LOAD_GLOBAL在两种情况下都会使用LOAD_GLOBAL 。 所以全局自由变量并不是那么特别。

    另一方面,词汇绑定变量被专门处理并包含在cell对象中,对象是词汇绑定的自由变量的存储空间,并位于给定函数的__closure__属性中。 为这些检查为自由变量提供的单元格会创建一个特殊的LOAD_DEREF指令。 LOAD_DEREF指令的描述是:

    LOAD_DEREF(i)

    加载单元格的槽位i中的单元格并释放可变的存储空间

    所以在Python中,自由变量只是在一个具有状态的对象的定义在词法上(即静态地)嵌套在具有状态的对象的另一个定义中的情况下才起作用。


    变量只是保留内存位置来存储值。 这意味着当你创建一个变量时,你在内存中保留一些空间。

    根据变量的数据类型,解释程序分配内存并决定可以在保留内存中存储的内容。 因此,通过为变量分配不同的数据类型,可以在这些变量中存储整数,小数或字符。

    赋值给变量

    Python变量不需要显式声明来保留内存空间。 当您为变量赋值时,声明会自动发生。 等号(=)用于赋值给变量。

    链接地址: http://www.djcxy.com/p/51129.html

    上一篇: variable in python?

    下一篇: How shall I understand this deep binding example in Python?