【问题标题】:A function that returns a global variable返回全局变量的函数
【发布时间】:2020-09-11 03:39:13
【问题描述】:

有没有办法编写一个返回全局变量的函数(在函数内部创建变量并在外部全局返回)?我无法在函数调用之前分配变量,因为我在 tkinter 上使用它,因此它在 While 循环中。

【问题讨论】:

  • “返回[s]一个全局变量”是什么意思?
  • 您可以返回,而不是变量。您是否尝试在函数内设置全局变量的值?这是可能的,但通常不推荐。
  • @ScottHunter 我的意思是,例如:我还没有创建变量 X,所以:createX(): x = 2 return x 这将返回值 2,但我实际上需要变量 x 来操作它
  • while 循环如何阻止您分配变量?

标签: python function scope global-variables


【解决方案1】:

不,函数可以set 全局变量,但不能返回任何可能影响全局状态的局部变量/值。

一般来说,全局变量是不好的,很难对你的程序进行推理。尽量使用只有本地状态的函数

【讨论】:

  • “返回一个全局变量”是什么意思?
  • 不知道,但不可能。我的理解是,OP 只是试图设置一个全局状态以在程序的不同部分之间传递它
  • 是什么都说不出来怎么知道是不可能的?
  • 直接修改 globals() 非常丑陋,甚至更糟糕的是返回一个值并分配它
  • @iTech “但是我的意思是,如果按照 OP 问题没有以 ad 开头的全局变量,那么 return 语句就不会影响全局状态” - 然后在你的答案中写下它;)因为目前尚不清楚“不能返回一个”是什么意思
【解决方案2】:

您可以使用global 将函数内的变量标记为全局变量。也可以返回变量的值。

def f():
    global x

    x = 1

    return x

【讨论】:

    【解决方案3】:

    是的,你可以,这是我正在编写的数据科学项目中的一个示例。

    _train_ds = None
    _val_ds = None
    
    
    def get_ds(split: str):
        def _get_ds():
            return CellExpressionGraphOptimized(split)
    
        if split == 'train':
            global _train_ds
            if _train_ds is None:
                _train_ds = _get_ds()
            return _train_ds
        elif split == 'validation':
            global _val_ds
            if _val_ds is None:
                _val_ds = _get_ds()
            return _val_ds
        else:
            raise NotImplementedError()
    
    
    def train_model():
        # ...
        train_ds = get_ds('train')
        val_ds = get_ds('val')
        # ...
    
    

    讨论

    我不同意全局变量是错误的并且是一种糟糕的编码习惯。这取决于您正在编写什么代码。 就我而言,我正在训练一些机器学习模型,函数train_model() 由一个库调用,该库在模型选择过程中自动多次调用它。变量_train_ds_val_ds 是一些我不想不必要地创建的内存数据集(我希望它们在函数train() 的各种调用中被重用),这里一个全局变量是一个非常透明、高效的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2018-10-10
      相关资源
      最近更新 更多