为什么在PHP和Python中for块会覆盖外部作用域?

为什么在PHP和Python中for块会覆盖外部作用域?,php,python,language-design,Php,Python,Language Design,在PHP或Python(其他语言可能适用)中,为什么在for(或foreach)中声明的值仍然存在(并覆盖)在外部范围中 例如,在PHP中: <?php $value = 0; $test = [1,2,3]; foreach ($test as $value) { echo $value; } echo $value; 在Python中: value = 0 test = [1,2,3] for value in test: print(value) print(v

在PHP或Python(其他语言可能适用)中,为什么在
for
(或
foreach
)中声明的值仍然存在(并覆盖)在外部范围中

例如,在PHP中:

<?php

$value = 0;
$test = [1,2,3];

foreach ($test as $value) {
    echo $value;
}
echo $value;
在Python中:

value = 0
test = [1,2,3]

for value in test:
  print(value)

print(value)
(执行)

将输出:

1233
1
2
3
3
它可能适用于我还不知道的其他语言

问题是为什么这些
是为
块设计的?
为什么它不像(例如)C,索引变量只存在于
作用域的
中(例如)?

查看关于python作用域的更一般的问题

您可以看到for循环根本不会影响范围。没有正在创建的新作用域。在循环内部,创建、读取和更新变量的方式与外部相同

您的问题可以改为“python为什么不使用块作用域?”。维基百科有很多关于这个主题的信息:


从这里的其他答案来看,有一种理论认为块作用域会使事情变得太复杂,你应该保持函数简短。如果您需要一个新的作用域,请创建另一个函数并调用它。

因此我可能在“
for
作用域”上有错误的措辞。考虑到这一点,问题将变成“为什么不创建新的作用域?”。我之所以强调原因,是因为我(现在更)意识到“没有创建新的范围”。您是否愿意将您的评论放在回答中,以便我可以接受?我很高兴你喜欢它,我把评论移到了我的回答中,这是语言的哲学;每种语言都有自己的特点。C!=蟒蛇说得对。我用C语言学习编程,所以我有偏见。但是,为什么设计成这样?我不是GvR。老实说,我不知道这里是否有人能回答你的问题。正如摩西所说,这是语言的哲学。这只是另一个想法。就像有其他哲学的框架一样,也有语言。我认为要得到更好的答案,你必须亲自联系PHP小组。也许他们可以告诉你他们在开发过程中的想法。感谢@godaygo,答案中链接的邮件有一句非常有趣的话:“我认为这种安排将允许几乎所有现有代码继续工作,并允许编写利用循环变量最终值的新代码。”因此Python中的原因可能是“在某一点上是这样的,因为脚本可能正在使用它,我们不想通过改变行为来破坏它们”