Python:如何使循环中声明的变量从外部不可见?

时间:2013-09-26 10:30:52

标签: python cycle

我必须为统计计算编写不可重复使用的脚本。他们的写作看起来像是注视着这些情节并添加/删除5行更多"。我有一个问题:当代码增长到几个屏幕滚动时,编写它变得很困难,因为命名空间被声明到循环体中的变量污染。

我知道,Python循环不是代码块,我知道,Guido van Rossum认为,我必须将循环体移动到函数和方法。但在我的情况下,不会简化代码中的更改,但会使其更难。

现在我使用虚拟类声明作为循环体,但是,也许,你知道更好的方法吗?

#what I use now

outer = 7, 40
for elm in outer:
    class Dummy:
        print elm * 2
        temp = elm * 3 #I don't want to see this outside my loops!

# print "temp", temp # should give error

2 个答案:

答案 0 :(得分:2)

您始终可以再次从全局命名空间中删除名称:

outer = 7, 40
for elm in outer:
    print elm * 2
    temp = elm * 3

del temp

但实际上,使用函数来填充特定任务。它使您的代码更易于维护和阅读。

答案 1 :(得分:0)

基于@Martjin的回复,并根据您对Matlab工作台的建议,这是您可以期待的替代解决方案。

解决方案

>>> from Workpad import Workpad
>>> with Workpad() as workpad:
    for elm in outer:
        print elm * 2
        workpad.temp = elm * 3
        workpad.temp1 = workpad.temp / 2
        print workpad.temp, workpad.temp1


14
21 10
80
120 60
>>> workpad.temp

Traceback (most recent call last):
  File "<pyshell#335>", line 1, in <module>
    workpad.temp
AttributeError: Workpad instance has no attribute 'temp'

要完成上述工作,您需要创建一个名为Workpad.py的模块,并将其放在导入路径中

class Workpad:
    def __exit__(self, *args):
        for e in dir(self):
            if not e in self.__attribs and e != '_Workpad__attribs':
                delattr(self, e)

    def __enter__(self):
        return self
    def __init__(self):
        self.__attribs = dir(Workpad)

我喜欢这个解决方案的原因是,它的目的是做,即创建一个范围。通常,如果需要嵌套多个范围,使用类或函数创建范围可能会产生误导和麻烦。