序:
到目前为止,我已经将Python用作全面的编程语言。现在我喜欢用它来记录一些注释(注释)和一些计算(Python代码)(我实际上是使用Emacs并将当前缓冲区一次又一次地发送到正在运行的IPython实例)。
问题:我喜欢在同一个文档中多次重用一些常见的变量名,如'A'或'd',而不会遇到我不小心忘记将值重新分配给其中一个变量名的问题。
到目前为止,我滥用了课堂陈述
# Topic one: bla bla
class _anon:
d = 10
A = d**2 * pi /4
# Topic two: bla bla
class _anon:
A = d**2 * pi /4 # error is raised since d is missing
这是有效的,因为类语句创建了一个作为变量作用域的执行框架,但我想知道这个用例是否有专用语法。
答案 0 :(得分:3)
没有。只有class
和def
块和模块(以及更新版本中的列表推导和生成器表达式 - 虽然这里不适用)引入了新的范围。只有类直接执行。因此,如果你想继续这个有争议的Python使用,你将不得不坚持使用class
,或者定义函数并直接调用它们。对于每个计算使用不同的文件在源代码级别上稍微不那么难看,但如果计算总是那么小,则可能不值得。
答案 1 :(得分:3)
如果我想模拟C / C ++块,这通常可以解决问题:
def _anon():
d = 10
A = d**2 * pi /4
_anon()
这些“块”可以嵌套。
如果可以接受一小块初始样板,你也可以使用装饰器调用该函数:
def block(function):
function()
现在您不必重复其名称:
@block
def _anon():
d = 10
A = d**2 * pi /4
请注意,函数修饰器通常返回一个函数,但是这个函数没有。结果是在执行代码后,名称“_anon”指向“None”,因此代码块实际上是匿名的。
答案 2 :(得分:2)
globals.clear()
几乎有效:
>>> a = 5
>>> b = 6
>>> a
5
>>> b
6
>>> globals().clear()
>>> a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
>>> b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'b' is not defined
问题在于它会吹走所有内容,包括globals
本身等有用的内容!如果您尝试第二次globals.clear()
,您会看到:
>>> globals.clear()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'globals' is not defined
有关此问题的解决方案,请参阅http://bytes.com/topic/python/answers/34902-how-clean-python-interpreters-environment#post129239
但是如果我要把Python变成计算引擎那么麻烦,我可能想知道是否有更好的工具用于GNU Octave。
答案 3 :(得分:2)
您可以随时使用del
d = 10
A = d**2 * pi /4
(...)
del d, A
# Topic two: bla bla
A = d**2 * pi /4 # error is raised since d is missing
“明确比隐含更好。” “可读性很重要。” “应该有一个 - 最好只有一个 - 明显的做法。”
如果你想要花哨的东西,如果“单字母变量”还活着“离创建点太远”,就有可能使单元测试失败,编写能够调试跟踪来验证的测试。通过这种方式,您不会忘记添加del
语句。