我在很多函数中声明了以下变量,因为我需要在每个函数中使用这些值。无论如何我可以在全球范围内声明它们,例如我不必在我的所有方法中声明它们吗?我在我的一类实例方法中使用了所有这些方法。
x = 0
y = 1
t = 2
在c#中我只是将它们声明为全局类变量,但问题是我不想总是将它们用作self.x,self.y和self.z,因为它得到了我的算法代码比现在更丑陋。你会怎么做?
这种情况的典型用法是:
def _GetStateFromAction(self, state, action):
x = 0
y = 1
t = 2
if (action == 0):
return (state[x], state[y] - 1, state[t])
if (action == 1):
return (state[x] - 1, state[y], state[t])
答案 0 :(得分:12)
如果它们都在一个模块中,那么它们只存在于该模块的命名空间中,您不必担心名称冲突。 (你仍然可以将它们导入其他的名称空间)
例如
MyModWithContstants.py
x = 0
y = 0
def someFunc():
dosomethingwithconstants(x,y)
我们也可以
anotherMod.py
from MyModWithConstants import x
# and also we can do
import MyModWithConstants as MMWC
def somOtherFunc():
dosomethingNew(x, MMWC.y)
## x and MMWC.y both refer to things in the other file
答案 1 :(得分:5)
除了单独的模块技巧,如果我想要它们在同一个模块中,我会经常把它们放在一个类like this中:
class PathConstants(object):
CSIDL_DESKTOP = 0
CSIDL_PROGRAMS = 2
def get_desktop():
return _get_path_buf(PathConstants.CSIDL_DESKTOP)
如果你想让它们更稳定,那么你可以进行setattr throw:
class ConstantExeption(Exception):
pass
class ProgramConstants(object):
foo = 10
bar = 13
def __setattr__(self, key, val):
raise ConstantExeption("Cannot change value of %s" % key)
# got to use an instance...
constants = ProgramConstants()
print constants.foo
constants.bar = "spam"
追溯:
10
Traceback (most recent call last):
File "...", line 14, in <module>
constants.bar = "spam"
File "...", line 9, in __setattr__
raise ConstantExeption("Cannot change value of %s" % key)
__main__.ConstantExeption: Cannot change value of bar
答案 2 :(得分:1)
您可以简单地在模块级别(即.py
源文件的顶级)声明这些变量,并且不需要使用self
或类似的东西。在这种情况下,我认为惯例是给他们大写的名字。
顺便说一句,我不禁要指出你可以像这样宣布他们:
x, y, t = 0, 1, 2
答案 3 :(得分:1)
如果这些“变量”是真正的常量,则在模块级别声明它们似乎是合乎逻辑的。如果你必须在函数内修改它们,你只需要在该函数中声明它们是全局的。
答案 4 :(得分:0)
您是否考虑过
global x, y, z
x=0
y=1
z=2
答案 5 :(得分:-1)
import __builtin__ __builtin__.__dict__["X"] = 5
这将在执行的所有模块中存储X常量,直到解释器退出。
请记住,要小心使用它,因为其他python开发人员不太可能期望这样。 我主要用它来存储翻译函数'_'。