我想使用函数属性来设置变量值作为使用全局变量的替代.但有时我会为函数指定另一个短名称.行为似乎总是做我想要的,即无论我使用长名称还是短名称,值都会分配给函数,如下所示.这有什么危险吗?
def flongname():
pass
f = flongname
f.f1 = 10
flongname.f2 = 20
print flongname.f1, f.f2
Run Code Online (Sandbox Code Playgroud)
最后一行返回10 20显示不同的函数名称引用相同的函数对象.对?
大多数人可能会说这是一个坏主意。我想使用字符串的内容作为变量的名称。我想完成可怕的事情:
s = 'x'
x = 1
Run Code Online (Sandbox Code Playgroud)
变量名x(不知何故?)来自 string 的地方s。
要回答“为什么?”,假设我有一个全局默认值x,我想要在函数中覆盖的选项。但:
x = 0
def f(**kw):
print x
f(x=1)
Run Code Online (Sandbox Code Playgroud)
打印0不1。如果我可以使用 kw.keys() 中的字符串重新分配x(或任何其他全局设置的变量),那么我会很高兴。
我意识到,这适用于重新分配x的f:
x = 0
def f(x=x):
print x
f(x=1)
Run Code Online (Sandbox Code Playgroud)
但是我想在我的命名空间中有许多变量的情况下这样做,我可能在某个时候想要覆盖而不重写我的模块中的每个函数定义。