制作全局变量的本地副本

问题描述 投票:2回答:2

我可能缺少真正明显的东西,但是如何创建具有相同名称的全局变量的本地副本?我有类似的东西:

d = {"one": 1, "two": 2, "three": 3}

def foo():
    d = d.copy()
    d["four"] = 4

我想在内部范围内创建d的副本,我可以根据需要进行修改而不会影响全局版本。这将抱怨d是赋值之前的引用,这很有意义,因为d被解释为局部变量。如果我将其声明为全局,则将对其进行修改。

如果我不介意它是否使用其他名称,例如d_local = d.copy(),这将是微不足道的,但是在这种情况下,这将是一个很大的麻烦,而不仅仅是查找和替换一个。

如果唯一的解决方法是使用新名称并处理后果,请告诉我。

python scope copy
2个回答
1
投票

如果您这样做,则必须使用另一个标识符。变量可以是局部变量,也可以是全局变量,但不能两者都存在。这就是整个作用域。当您在函数中分配某物时,它将默认为本地。但是,如果将其设置为全局变量,即使用global语句,它将重新分配您的全局变量,这可能是您不希望的(尽管那样,它会变异new object而不是被引用的变量)通过在调用函数之前使用全局变量)。

这里最合理的做法是以d作为参数。然后只需执行d = d.copy()

so:

d = {"one": 1, "two": 2, "three": 3}

def foo(d):
    d = d.copy()
    d["four"] = 4

foo(d)

如果我不介意它是否具有其他名称,这将是微不足道的,例如:d_local = d.copy(),但是在这种情况下这将是一个很大的麻烦而不仅仅是查找并替换其中一个。

这听起来像是您的代码的基本问题。标识符除了可以帮助您理解自己的代码外,实际上不重要。如果您的逻辑依赖于标识符,那几乎总是不好的。阅读Keep Data Out of Your Variable Names,这是Ned Batchelder撰写的另一本出色的教程。


1
投票

通常,使用具有相同名称的局部变量和全局变量是一种非常糟糕的做法,因为它会引起混淆。您可以将d用作参数,也可以简单地使用其他名称。但是,如果您真的想保持代码结构不变(不建议这样做),则可以在全局范围内定义一个函数,该函数返回d的副本。因此:

d = {"one": 1, "two": 2, "three": 3}

def copyD():
  return d.copy()

def foo():
  d = copyD()
  d["four"] = 4
© www.soinside.com 2019 - 2024. All rights reserved.