我有以下使用综合列表的代码:
x = int ( input())
y = int ( input())
z = int ( input())
n = int ( input())
ret_list = [ (x,y,z) for x in range(x+1) for y in range(y+1) for z in
range(z+1) if x+y+z!=n ]
print(ret_list)
在python2中的工作方式与预期一致。然而,在python3中,我得到了以下错误:
print([ (x,y,z) for x in range(x+1) for y in range(y+1) for z in range(z+1) if
x+y+z!=n ])
File "tester.py", line 16, in <listcomp>
print([ (x,y,z) for x in range(x+1) for y in range(y+1) for z in range(z+1) if
x+y+z!=n ])
UnboundLocalError: local variable 'y' referenced before assignment
我只是好奇我做错了什么。虽然在python2中工作得很棒,但我可能在Python3中遗漏了一些东西。谢谢。
发布于 2018-10-09 11:06:19
由于x
y
和z
在列表理解中被定义为“局部”变量,因此Python3将它们视为“局部”变量,并且不使用/查看全局值。
Python2不会造成这种差异(因此在退出理解时,有些人会观察到变量"leak“),并且它的行为与使用普通循环时完全一样
这里有更好的解释:Python list comprehension rebind names even after scope of comprehension. Is this right?
真正有趣的是,python首先抱怨的是y
,而不是x
。好吧,由于我很好奇,我在这里问了这个问题:why the UnboundLocalError occurs on the second variable of the flat comprehension?
正确的方法是对循环索引使用不同的变量名(不确定我选择的名称是否很好,但至少无论python版本如何,这种方法都有效):
ret_list = [ (x1,y1,z1) for x1 in range(x+1) for y1 in range(y+1) for z1 in range(z+1) if x1+y1+z1!=n ]
https://stackoverflow.com/questions/52719472
复制相似问题