如何在python中创建新的作用域

Bor*_*lik 19 python scope

在许多语言(和地区)有通过创建类似于块创建本地范围的一个很好的练习.

void foo()
{
     ... Do some stuff ...

     if(TRUE)
     {
         char a;
         int b;

         ... Do some more stuff ...
     }

     ... Do even more stuff ...
 }
Run Code Online (Sandbox Code Playgroud)

如何在python中实现这一点而不会出现意外的缩进错误,并且不使用某种if True: 技巧

Dou*_*der 9

你为什么要在python中创建新的作用域呢?

在其他语言中执行此操作的正常原因是变量作用域,但在python中不会发生这种情况.

if True:
    a = 10

print a
Run Code Online (Sandbox Code Playgroud)

  • @DouglasLeeder 我知道:这是 Python 中缺少的功能。 (4认同)
  • 最后我检查过,CPython的垃圾收集器在函数返回之前不会DECREF. (3认同)
  • 不仅是内存管理.还要避免使用临时变量来混淆周围的范围. (3认同)
  • “无论如何,为什么要在python中创建新作用域?” 你真的不知道吗 为了将变量的存在限制为:a)增强变量的安全重用,以及b)避免编程错误。 (3认同)

bat*_*rat 8

在Python中,范围界定有三种类型:全局,本地和类.您可以创建专门的"范围"词典以传递给exec/eval().此外,您可以使用嵌套范围(在另一个范围内定义函数).我发现这些在我的所有代码中都足够了.

正如道格拉斯·莱德已经说过的那样,在其他语言中使用它的主要原因是变量范围,而这在Python中并不存在.另外,Python是我用过的最易读的语言.它会违背可读性,做一些像if-true技巧(你说你想避免的).在这种情况下,我认为最好的办法是将代码重构为多个函数,或者使用单个作用域.我认为Python中的可用范围足以涵盖每个可能的事件,因此本地范围不一定是必要的.

我希望这有帮助.

  • 出于可读性的目的,创建临时变量离开的局部范围正是为了避免污染周围范围.这是一件很棒的事情,遗憾的是它在Python中并不存在. (9认同)
  • 由于以下原因而被否决:_我认为Python中的可用范围足以覆盖所有可能发生的事情,因此实际上没有必要进行局部范围界定。_为什么在Python中比在其他语言(如C,C#,Java,生锈等?(它们都有创建本地作用域的能力)我认为这个答案很不好,因为它没有考虑足够的情况。特别是想到长方法。正如@Konstantin指出的那样,有时您_want_能够避免污染外部作用域,而Python却没有提供这种功能。 (2认同)

小智 7

如果您只想创建临时变量并让它们在使用后立即被垃圾收集,您可以使用

del varname
Run Code Online (Sandbox Code Playgroud)

当你不再想要它们的时候。

如果只是为了美观,您可以使用注释或额外的换行符,但不需要额外的缩进。


Dav*_*cke 5

Python 正好有两个作用域,局部作用域和全局作用域。函数中使用的变量在本地范围内,无论它们是在什么缩进级别创建的。调用嵌套函数将产生您正在寻找的效果。

def foo():
  a = 1

  def bar():
    b = 2
    print a, b #will print "1 2"

  bar()
Run Code Online (Sandbox Code Playgroud)

仍然像其他人一样,我不得不问你为什么要在函数内创建一个有限的作用域。

  • 请参阅下面我的答案,了解更好的方法,例如创建一个函数以立即调用一次,或创建一组长函数。然后稍后*以正确的顺序*调用它们很容易出错。人们真正想要的是一种方法,使线性的、从不重用的“匿名”代码部分具有私有和临时的命名空间,以保证“管道和配件”的安全,避免在相同的、可能长达几页的线性代码中的其他地方发生意外连接。 (3认同)