我的问题涉及本声明的输出:
for x in range(4), y in range(4):
print x
print y
结果:
[0, 1, 2, 3]
2
True
2
似乎涉及到比较,我只是无法弄清楚为什么输出的结构是这样的。
答案 0 :(得分:6)
我的猜测是你从交互式控制台运行它,并且已经定义y
值为2(否则,你得到NameError: name 'y' is not defined
)。这将导致您观察到的输出。
这是因为for x in range(4), y in range(4):
在评估时实际上等同于以下内容:
for x in (range(4), y in range(4)):
减少到......
for x in ([0,1,2,3], 2 in range(4)):
再次减少到......
for x in ([0,1,2,3], True):
然后导致for
循环的2次迭代,因为它迭代元组的每个元素:
x = [0,1,2,3]
x = True
。(当然,y
仍为2。)
答案 1 :(得分:3)
你在那里创造了一个奇怪的,奇怪的东西。
>>> y = 2
>>> range(4), y in range(4)
([0, 1, 2, 3], True)
y in range(4)
是会员资格测试。
range(4), y in range(4)
是一对物品;一个元组。
变量x
设置为范围(4),然后设置为y in range(4)
的结果。
变量y
只是带着一个值;它不是由for
语句设置的。
这只能在命令行上进行黑客攻击,并在y
左右放置随机内容。
这根本不是合理的Python代码。
[是的,单词in
有两个含义。 ()
和其他几种语法也是如此。]
答案 2 :(得分:3)
在运行此代码之前,您似乎已定义y
。您要迭代的是两项元组:第一项是range
- 生成列表,第二项是True
,这是y in range(4)
的结果:
>>> y = 2
>>> for x in range(4), y in range(4):
print x, 'x'
print y, 'y'
[0, 1, 2, 3] x
2 y
True x
2 y
我怀疑你试图做的是迭代两个列表中的两个变量。请使用zip
。
答案 3 :(得分:1)
如果你想要x和y的所有4 x 4组合,你需要2个嵌套循环:
for x in range(4):
for y in range(4):
print x, y
或者如果你真的想要使用一个循环:
import itertools
for (x, y) in itertools.product(range(4), range(4)):
print x, y
itertools.product()
生成所有可能的组合:
在这个简单的情况下,这比2个循环的可读性差,但是itertools模块还有许多其他强大的功能,值得了解......
如果您希望x
和y
在两个序列上并行前进(也称为“锁步”迭代):
for (x, y) in zip(range(4), range(4)):
print x, y
# `zip(range(4), range(4))` is silly since you get x == y;
# would be useful for different sequences, e.g.
# zip(range(4), 'abcd')
[背景:名称zip
来自Haskell;想想拉链如何从这里拿出一颗牙齿,从那里拿出一颗牙齿:
zip()
切断最短序列的长度; itertools模块有其他变体......]