制作全局变量的本地副本

make local copy of global variable

我可能遗漏了一些非常明显的东西,但是如何创建具有相同名称的全局变量的本地副本? 我有类似的东西:

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

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

我想在内部范围内创建一个 d 的副本,我可以随意修改而不影响全局版本。这会抱怨 d 是赋值前的引用,这很有意义,因为它被解释为局部变量。如果我声明它是全局的,这将修改它。

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

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

如果您这样做,则必须使用其他标识符。变量可以是局部变量或全局变量,但不能同时是全局变量……这就是 作用域的全部要点 。当您分配给函数中的某些内容时,它将默认为本地。但是如果你把它变成全局的,即通过使用 global 语句,它会重新分配你的全局变量,这可能是你不想要的(尽管它会改变一个 new object 不是在调用函数之前被全局变量引用的那个)。

这里最合理的做法是把d作为参数。然后简单地做 d = d.copy()

所以:

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

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

foo(d)

This would be trivial if I didn't mind if it had a different name eg: d_local = d.copy(), but that would be a big hassle in this situation and not just a find and replace one either.

听起来您的代码存在 根本性的 问题。除了帮助您理解您自己的代码之外,标识符实际上并不重要。如果您的逻辑依赖于标识符,那几乎总是不好的。阅读 Keep Data Out of Your Variable Names,这是 Ned Batchelder 的另一篇优秀教程。

通常使用同名的局部变量和全局变量是一种非常糟糕的做法,因为它会引起混淆。您可以使用 d 作为参数,或者只是使用不同的名称。但是,如果您真的想保持代码结构不变(我不推荐这样做),您可以在全局范围内定义一个函数,returns d 的副本。因此:

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

def copyD():
  return d.copy()

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

正如@rici 所指出的,可以使用全局关键字在局部范围内定义该函数:

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

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

这段代码更好,因为copyD函数真的不会用到别的地方。