0

来自模块的示例代码:

somevar = "a"

def myfunc(somevar = None):
    # need to access both somevars ???
    # ... if somevar was specified print it or use the global value
    pass

if __name__ == '__main__':
    somevar = "b" # this is just for fun here
    myfunc("c")
    myfunc() # should print "a" (the value of global variable)

使用同名至少有两个原因:教育(学习如何使用本地/全局)和模块中的使用。

假设此代码是您模块的一部分:mymodule并且您想要执行以下操作:

import mymodule

mymodule.samevar = "default"
...
mymodule.myfunc(somevar = "a")
...
mymodule.myfunc()

正如您可以想象的那样,这个例子被简化了,想象somevar参数是许多可选参数之一,并且 myfunc 在许多地方被调用。

4

4 回答 4

5

到目前为止,正如其他答案所说,最好的方法是避免这种非常非常糟糕的设计:只是不要为两个不同的事物使用相同的名称!

如果您陷入这种糟糕的设计,可能是因为您公司的最高架构师规定了它,而且它是不可协商的(例如,有大量的客户代码依赖于全局和参数的名称),这是首要任务对你来说,确保你的简历是最新的,用最好的打印机打印出来,并开始与你的社交网络成员联系,在一个运行更合理的地方寻找工作;接下来,为了避免在找到更好的工作之前失去健康保险,请尝试

def myfunc(somevar = None):
    if somevar is None:
        print globals().get('somevar')
    else:
        print somevar

我还将您的名称重命名为mufuncmyfunc因为这是它被调用的名称(尽管考虑到您假设的最高建筑师似乎能够实施的非常糟糕的设计,也许他指定了该函数的名称与它的名称不同定义为? 似乎与系统名称冲突有关,这个假设但已经非常可恨的家伙被认为是强加给你的!-)。

于 2010-08-10T17:22:39.430 回答
1

为什么局部变量必须与全局变量同名?重命名其中一个似乎是一个简单的解决方案。另一种选择是将全局变量作为参数传递,但这仍然会给您一个不同的变量名称来访问保存值。

于 2010-08-10T17:15:53.783 回答
0

两种解决方案:

  1. 重命名变量,即somevar_.
  2. 将全局移动到不同的模块。你可以写一个模块myappdefaults

    import myappdefaults
    print myappdefaults.somevar
    
于 2010-08-10T17:13:39.953 回答
0

这是做事的正确方法。

somevar = "a"

def mufunc(_somevar = None):
    global somevar
    if _somevar:
        print _somevar
    else:
        print somevar

if __name__ == '__main__':
    global somevar
    somevar = "b"
    myfunc("c")
    myfunc() $ should print "c"
于 2010-08-10T17:24:04.437 回答