【问题标题】:Assign function-local parameter to global variable with same name将函数局部参数分配给同名的全局变量
【发布时间】:2018-06-02 17:23:39
【问题描述】:

我有一个模块;说它的结构如下:

algorithms
 ├─ __init__.py
 └─ algorithm.py

在我的算法模块中,我有一些全局变量,我想创建一个方便的初始化程序来设置它们。我想对初始化程序的参数使用与 var 相同的名称,但这会导致局部名称和全局名称的冲突。我能想到的最简洁的实现方式是:

lower = None
upper = None

def init_range(lower, upper):
   _lower = lower
   global lower
   lower = _lower

   _upper = upper
   global upper
   upper = _upper

如果这是一堂课,(我认为)我可以做类似self.lower = lower 的事情。有没有更简洁的方法来做我正在为模块全局变量做的事情? algorithm.lower = lower 之类的东西?

编辑:原来我的解决方案不起作用。

【问题讨论】:

  • 你不想听到这个,但你的解决方案不起作用,正确的解决方案是避免全局变量。
  • 你说得对,它不起作用:(但就我而言,我已经在任何地方都使用了全局变量(这是一个非常简单的例子),没有时间改变它。

标签: python python-2.7


【解决方案1】:

你可以使用globals函数获取代表全局作用域的字典,update它:

def init_range(lower, upper):
   globals().update(lower=lower, upper=upper)

【讨论】:

  • 我认为这个答案比我的要好,因为this,读者应该知道。
【解决方案2】:

如果您真的坚持保留参数名称 lower 和 upper(为什么不只是 new_lower、new_upper 或类似名称?)那么您可以将任务委托给具有替代变量名称的内部函数.

def init_range(lower, upper):
    def _init_range(_lower, _upper):
        global lower
        global upper
        lower = _lower
        upper = _upper

    _init_range(lower, upper)

演示:

>>> lower is None, upper is None
(True, True)
>>> init_range(lower=1, upper=2)
>>> lower, upper
(1, 2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多