制作全局变量的本地副本
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函数真的不会用到别的地方。
我可能遗漏了一些非常明显的东西,但是如何创建具有相同名称的全局变量的本地副本? 我有类似的东西:
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函数真的不会用到别的地方。