Python:用于语句行为

Python:用于语句行为,python,syntax,Python,Syntax,我的问题涉及这项声明的产出: for x in range(4), y in range(4): print x print y 结果: [0, 1, 2, 3] 2 True 2 这似乎是一个比较,我只是不明白为什么输出是这样的结构。你在那里创造了一个奇怪的东西 >>> y = 2 >>> range(4), y in range(4) ([0, 1, 2, 3], True) 范围(4)中的y是一个成员资格测试 范围(4),范围(4)

我的问题涉及这项声明的产出:

for x in range(4), y in range(4):
    print x
    print y
结果:

[0, 1, 2, 3]
2
True
2

这似乎是一个比较,我只是不明白为什么输出是这样的结构。

你在那里创造了一个奇怪的东西

>>> y = 2
>>> range(4), y in range(4)
([0, 1, 2, 3], True)
范围(4)中的
y是一个成员资格测试

范围(4),范围(4)中的y
是一对项目;元组

变量
x
设置为范围(4),然后是范围(4)
y的结果

变量
y
仅仅是一个值;它不是由
for
语句设置的

这只适用于在命令行中输入任意内容,并在左下角放置
y

这根本不是明智的Python代码


[是的,
中的
一词有两种含义。
()和其他几段语法也是如此。

在运行此代码之前,您似乎已经定义了
y
。您正在迭代的是一个两项元组:第一项是
range
生成的列表,第二项是
True
,它是范围(4)中
y的结果:


我怀疑您试图做的是迭代两个列表中的两个变量。用于此操作。

我猜您正在从交互式控制台运行此操作,并且已使用值2定义了
y
(否则,您将得到
NameError:未定义名称“y”
)。这将导致您观察到的输出

这是由于
对于范围(4)中的x,范围(4)中的y:
在计算时实际上等于以下值:

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 x in ([0,1,2,3], 2 in range(4)):
for x in ([0,1,2,3], True):
这将导致
循环的
迭代2次,因为它迭代元组的每个元素:

  • x=[0,1,2,3]
  • x=True

  • (当然,
    y
    仍然是2。)

    Dav完美地确定了您编写的语法不起作用的原因。 下面是一些语法,它们对您可能要做的事情起作用:


    如果希望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
    
    生成所有可能的组合:

    在这种简单的情况下,它的可读性不如2个循环,但itertools模块还有许多其他强大的功能,值得了解


    如果希望
    x
    y
    在两个序列上并行前进(也称为“锁步”迭代):

    [背景:名称
    zip
    来自Haskell;想想拉链是如何从这里取一颗牙,从那里取一颗牙的:


    zip()?Mine在
    for
    上失败,出现
    名称错误:未定义名称“y”
    。您正在使用哪一版本的Python?您是否正在尝试编写嵌套循环?你在用什么教程?@Marcelo:y在我没注意到的时候被初始化了。见下面的答案@洛特:没有教程。在尝试寻找两个变量上的循环的简短形式时注意到了这一点……也许你应该找到一个好的教程。好的,似乎我初始化了y一些行。我没有注意到that@BandGap:然后您会得到一个
    名称错误:未定义名称“y”
    。所以我很确定它是初始化的。@BandGap,在运行循环之前用另一个打印测试一下怎么样?它不应该用在任何脚本中,我只是想知道这里会发生什么,感谢这个深入的分析
    zip(范围(4),范围(4))
    是一个毫无用处的例子;)我知道拉链是怎么工作的。谢谢我不是一个彻头彻尾的傻瓜,只是因为SilentGhost给问题贴上了“初学者”的标签:我们怎么知道?我认为这是一个很好的答案,他显然花了时间来帮助我。对不起,我并不是有意要表现出居高临下的态度,只是相信一般来说,自足的解释会更好。此外,在某些情况下,可能在谷歌上搜索这个问题的人可能是python noobs。[并把图片放进去,因为我真的很喜欢拉链动画;我现在梦想建立一些动画编程参考…]