在C中,有一个选项可以决定是否要覆盖循环变量。
例如,在此代码段中重写了i
:
int i = 3;
for (i = 0;i < 5;i++);
但在此代码段中未覆盖i
:
int i = 3;
for (int i = 0;i < 5;i++);
Haven在Python中找到了类似的选项。
例如,在此代码段中重写了i
:
i = 3
for i in range(5):
pass
在这种情况下如何防止i
被覆盖?
答案 0 :(得分:2)
这与范围有关。在你列出的C中的例子中,int i = 0在for循环范围内('i'特别是那个forloop的本地成员。不是'我'没有被覆盖,而是他们'在两个不同的地方,所以他们根本没有相关(除了视觉上你看到它)。
Python范围: Short Description of the Scoping Rules?
答案 1 :(得分:2)
我建议在同一个函数中使用相同的名称来引用不同的变量是不好的做法。即使在C语言中,在C语言中还有许多其他不良做法,例如在python中无法做到,例如没有缩进。
我的观点是C案是不受欢迎的。我承认这是可以接受的:
for (int i = 0; i < 42; i++) { ... }
for (int i = 0; i < 37; i++) { ... }
但是拥有外部版本的i
也会让人感到困惑。
这些类型的循环主要在C中用于迭代数组。在示例i
中是int
,但它可能是一个递增的指针。
在python中几乎不需要使用range()
计数循环因为我们有对象迭代器。
沮丧的C程序员可能会在python中执行此操作:
for i in range(len(mylist)):
print(mylist[i])
但以下是首选:
for list_item in mylist:
print(list_item)
所以我的第二点是C案件是不必要的。
Python中的哲学基于对象和对象迭代器。在C你没有那个。在C myarray[i]
中是*(myarray + i)
的语法糖,我们只是不想在python中,我们有比C更多不同类型的容器,迭代应该是一致的。
我并不是说你永远不需要索引号,但总是enumerate()
。
答案 2 :(得分:1)
您必须将循环放入新范围。一种方法是使用一个函数。另一种方法是将它放入生成器表达式中:
i = 3
a = min((i-10)**2 for i in range(5))
print(a, i)
<强>输出强>
36 3
Python 3中的另一个选项是将循环放入列表推导中,但在Python 2中,不创建新范围(出于效率原因)。
i = 3
a = min([(i-10)**2 for i in range(5)])
print a, i
<强>输出强>
36 4
该列表comp不像上面的生成器表达式那样高效:它使用更多RAM,min
必须等待构造完整列表,而在生成器表达式版本中它可以启动处理由gen exp产生的值。