Python中的for语句
我对下面这段Python代码中的"x"感到困惑。
>>> # Grocery list
... grocery_list = ['apples', 'bananas', 'oranges', 'milk']
>>> for x in grocery_list:
... print(x, len(x))
我不太明白在上面的for语句中,x的作用是什么。这个"x"是一个在for语句中定义的变量吗,还是其他什么东西?它看起来和我习惯的定义变量的方式有点不同,但我注意到"x"可以是任何东西,这让我觉得它其实是一个用户自定义的变量。
请帮帮我。
8 个回答
这个变量会在后台依次被赋值为列表中的每一个值。如果列表里存的是引用,那么这个引用就会被赋给循环变量。
这几乎等同于:
for i in xrange(len(grocery_list)):
x = grocery_list[i]
# rest of code here
但这样写要干净得多,而且(可能)更快。变量名(x
)并不重要,你可以随便起个名字。
当循环执行完后,这个变量仍然在作用范围内,并且保存的是最后一次循环的值。所以如果你用 break
跳出循环,最后的值会是:
>>> for i in xrange(100):
... if i == 10: break
...
>>> i
10
Python是一种后期绑定的动态语言。虽然Python程序员和文档中常常提到“变量”和“赋值”,但更准确的说法是“名称”和“绑定”。
在你的例子中,x
是一个对象的名称。在每次循环中,它会被“绑定”到你列表中的下一个对象。Python的列表,以及大多数其他Python容器和许多其他Python对象类,都有迭代功能。也就是说,它们定义了一些函数,遵循一种协议,使得它们可以在for
循环中使用。
正如你所注意到的,Python中的名称(类似于其他语言中的“变量”)可以绑定到任何类型的对象。一个列表可以包含任何混合的对象引用。因此,当你遍历一个列表时,你的“变量”(或者循环中的名称)可以绑定到不同类型的对象,甚至在每次循环中绑定的类型都可能不同。
你还可以通过“元组解包”在每次迭代时绑定多个名称。例如,下面这段代码是处理字典的常用方法:
for key, value in some_dictionary.items():
# do something with each key and its associated value
这种形式并不局限于字典。字典的.items()
方法返回一系列包含两个元素的元组,这种for
循环的形式可以用于任何返回两个元素元组(甚至是两个元素列表)的列表或序列。同样,你也可以在包含固定数量元素的序列上看到元组解包的使用:
for category, item, quantity, price in some_invoice_query():
# do something with these items, etc.
从概念上讲,在大多数编程语言中,“变量”是某种类型数据的占位符(以及在程序源代码中引用该占位符的名称)。然而,在Python(和其他后期绑定的动态语言)中,名称是对一个对象的引用,并不对引用的对象的类型或类施加任何限制。
你可以粗略地把Python的名称想象成C语言中的空指针。
是的,它是在for语句里面定义的。它只是一个用来表示列表中某个元素的占位符,可以叫任何名字,比如说。
grocery_list = ['apples', 'bananas', 'oranges', 'milk']
for grocery in grocery_list:
print(grocery, len(grocery))