是否可以在python中插入额外的范围[重复]
Posted
技术标签:
【中文标题】是否可以在python中插入额外的范围[重复]【英文标题】:Is it possible to insert extra scopes in python [duplicate] 【发布时间】:2019-06-06 14:20:56 【问题描述】:我想知道是否可以在我的代码中插入额外的范围,而无需定义函数。我遇到的问题如下:
def func(a, b, c):
some_var = [a for a in b]
# do stuff with a
我的期望是 a 仍然是我传递给函数的值,因为我希望另一个 a 在列表理解的范围内(必须永远搜索那个错误!)。
我怎样才能重写它,使列表推导中的 a 在它自己的范围内?
我想要比它更优雅的东西
def func(a, b, c):
def helper(v):
return [a for a in v]
some_var = helper(b)
# do stuff with a
在使用 定义范围的语言中,您可以执行类似
def func(a, b, c)
some_var = null
some_var = [a for a in b]
# do stuff with a
在 Python 中有类似的东西吗?
【问题讨论】:
这是什么python版本?你为什么不在 python 3 上? 列表推导(但不是集合推导、字典推导和生成器表达式)在 Python 2 中具有泄漏范围。这已在 Python 3 中修复 @ParitoshSingh Python 2.7。这是我工作的要求(我知道,我知道,也喜欢python 3) @User12547645 你不能把内部变量重命名为别的吗? @User12547645 只是重命名循环变量?如果您希望它在自己的范围内,那么名称无论如何都无关紧要。 【参考方案1】:如果可以,请转到 python 3。已知 python 2 中的列表推导会将变量泄漏到命名空间中。
如果不是,您可以通过使用不泄漏变量的生成器表达式来模拟干净的列表推导式,并包装在列表调用中。
def func(a, b, c):
some_var = list(a for a in b) #Does not leak a
# do stuff with a
【讨论】:
【参考方案2】:您可以通过将列表理解包装为 dict 理解来插入额外的范围,例如:
>>> None: [x for x in range(5)] for __ in range(1).values()[0]
这不会泄露x
的值,但它不是真正可读的。
【讨论】:
【参考方案3】:如果您只是创建b
的副本,这样做不是更容易吗:
def func(a, b, c):
some_var = b[:]
无需担心a
会在额外的范围内等等。
【讨论】:
以上是关于是否可以在python中插入额外的范围[重复]的主要内容,如果未能解决你的问题,请参考以下文章