为什么 for 块会覆盖 PHP 和 Python 中的外部范围?
Why do for blocks overwrites outer scope in PHP and Python?
在PHP或Python(其他语言可能适用)中,为什么在for
(或foreach
)中声明的值仍然存在(并覆盖)在外部范围内?
例如,在PHP中:
<?php
$value = 0;
$test = [1,2,3];
foreach ($test as $value) {
echo $value;
}
echo $value;
(执行它(也有一个for
循环)here)
将输出:
1233
并在 Python 中:
value = 0
test = [1,2,3]
for value in test:
print(value)
print(value)
(执行here)
将输出:
1
2
3
3
它可能适用于我还不知道的其他语言。
问题是为什么这些for
块设计成这样?
为什么它不像(例如)C,其中索引变量仅存在于 for
范围内(例如 here)?
查看 this answer 以了解有关 python 范围的更一般性问题。
你可以看到 for-loops 根本不影响范围。没有创建新范围。在循环内,您可以像在循环外一样创建、读取和更新变量。
您的问题可以改写为 "why doesn't python use block scope?"。维基百科有很多关于这个主题的信息:en.wikipedia.org/wiki/Scope_(computer_science)#Levels_of_scope
根据 SO 上的其他答案,有理论认为块作用域会使事情变得过于复杂,无论如何您都应该保持函数简短。如果您需要一个新的作用域,请创建另一个函数并调用它。
在PHP或Python(其他语言可能适用)中,为什么在for
(或foreach
)中声明的值仍然存在(并覆盖)在外部范围内?
例如,在PHP中:
<?php
$value = 0;
$test = [1,2,3];
foreach ($test as $value) {
echo $value;
}
echo $value;
(执行它(也有一个for
循环)here)
将输出:
1233
并在 Python 中:
value = 0
test = [1,2,3]
for value in test:
print(value)
print(value)
(执行here)
将输出:
1
2
3
3
它可能适用于我还不知道的其他语言。
问题是为什么这些for
块设计成这样?
为什么它不像(例如)C,其中索引变量仅存在于 for
范围内(例如 here)?
查看 this answer 以了解有关 python 范围的更一般性问题。
你可以看到 for-loops 根本不影响范围。没有创建新范围。在循环内,您可以像在循环外一样创建、读取和更新变量。
您的问题可以改写为 "why doesn't python use block scope?"。维基百科有很多关于这个主题的信息:en.wikipedia.org/wiki/Scope_(computer_science)#Levels_of_scope
根据 SO 上的其他答案,有理论认为块作用域会使事情变得过于复杂,无论如何您都应该保持函数简短。如果您需要一个新的作用域,请创建另一个函数并调用它。