我想知道是否可以在不定义函数的情况下在代码中插入额外的作用域。我遇到的问题如下:
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中有相似之处吗?
答案 0 :(得分:2)
如果可以,请转到python3。已知python 2中的列表理解会将变量泄漏到名称空间中。
但是,如果不是这样,则可以使用不泄漏变量的生成器表达式来模拟干净的列表理解,这些表达式包装在列表调用中。
def func(a, b, c):
some_var = list(a for a in b) #Does not leak a
# do stuff with a
答案 1 :(得分:2)
您可以通过用dict理解将列表理解包装起来来插入额外的作用域,例如:
>>> {None: [x for x in range(5)] for __ in range(1)}.values()[0]
这不会泄漏x
的值,但是它并不真正可读。
答案 2 :(得分:0)
如果您只是创建b
的副本,那么这样做是否更容易:
def func(a, b, c):
some_var = b[:]
无需担心a
是否在其他范围之内。