如何在python中定义自由变量? - python

python doc中的本地/全局/自由变量定义:

如果名称绑定在块中,则除非声明为非本地,否则它是该块的局部变量。如果在模块级别绑定了名称,则该名称为全局变量。 (模块代码块的变量是局部变量和全局变量。)如果在代码块中使用了变量但未在其中定义,则该变量为空闲变量

代码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 1返回自由变量

x中,foo()全局变量,已使用但未在locals()中定义。
但是,它不是的免费变量,因为ojit_code不会返回它。
我认为这不是医生所说的。 自由变量有技术定义吗?

参考方案

自由变量的定义:已使用,但既不是全局的也不是的。
例如:

  • x在代码1中不是免费的,因为它是全局变量。
  • x在代码2的bar()中不是免费的,因为它是绑定的变量。
  • x是免费的foo()
  • Python的区别在于闭包。当前环境中未定义自由变量,即e。局部变量的集合,也是而不是的全局变量!因此,必须在其他地方定义。这就是闭包的概念。在代码2中,foo()x中定义的bar()上关闭。 Python使用词法作用域。这意味着,解释器仅通过查看代码就可以确定范围。
    例如:xfoo()中被称为变量,因为foo()包含在bar()中,而x绑定在bar()中。
    全局范围由Python专门处理。可以将全局作用域视为最外部作用域,但是由于性能原因,我没有这样做。因此,x不可能同时是免费全局
    免除
    生活不是那么简单。存在个免费的全局变量。 Python文档(执行模型)说:

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

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

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

    Python:对于长时间运行的进程,通过还是休眠? - python

    我正在编写一个队列处理应用程序,该应用程序使用线程等待和响应要发送到该应用程序的队列消息。对于应用程序的主要部分,只需要保持活动状态即可。对于像这样的代码示例:而True: 通过要么而True: time.sleep(1)哪一个对系统的影响最小?除了保持python应用运行外,什么都不做的首选方式是什么? 参考方案 我可以想象time.sleep()会减少系…

    Python:无符号32位按位算术 - python

    试图回答另一篇有关其解决方案涉及IP地址和网络掩码的文章时,我陷入了普通的按位算法。在Python中,是否存在一种标准的方式来进行按位AND,OR,XOR,NOT运算,假设输入是“32位”(可能是负数)整数或long,并且结果必须是[[ 0,2 ** 32]?换句话说,我需要一个与无符号长整数之间的C按位运算有效的Python对应物。编辑:具体问题是这样的:…

    >> Python中的运算符 - python

    >>运算符做什么?例如,以下操作10 >> 1 = 5有什么作用? 参考方案 它是右移运算符,将所有位“右移”一次。二进制10是1010移到右边变成0101这是5

    Python:如何从字节中提取特定位? - python

    我有一条消息,显示为14 09 00 79 3d 00 23 27。我可以通过调用message[4]从此消息中提取每个字节,例如,这将给我3d。如何从该字节中提取单个8位?例如,如何将24-27位作为单个消息?只需28位? 参考方案 要回答问题的第二部分,您可以使用按位运算来获取特定的位值# getting your message as int i = …

    Python:检查是否存在维基百科文章 - python

    我试图弄清楚如何检查Wikipedia文章是否存在。例如,https://en.wikipedia.org/wiki/Food 存在,但是https://en.wikipedia.org/wiki/Fod 不会,页面只是说:“维基百科没有此名称的文章。”谢谢! 参考方案 >>> import urllib >>> prin…