Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么是本地的 ;变量在 之后可见和可访问;对于 ;循环结束了吗?_Python - Fatal编程技术网

Python 为什么是本地的 ;变量在 之后可见和可访问;对于 ;循环结束了吗?

Python 为什么是本地的 ;变量在 之后可见和可访问;对于 ;循环结束了吗?,python,Python,我想知道在python中,为什么d在for循环完成后是可见的和可访问的?在C中,这是不可能的。它在python中有效吗 for i in range(4): d = i * 2 print(d) 联机编译器链接。Python没有块作用域变量。相反,它有函数作用域、类作用域和全局作用域 换句话说,函数中任何地方初始化的变量都可以在该点之后访问。例如: for x in range(2): pass print(x) # <--- x is accessible 范围(2)

我想知道在python中,为什么
d
for
循环完成后是可见的和可访问的?
C
中,这是不可能的。它在python中有效吗

for i in range(4):
    d = i * 2
print(d)

联机编译器链接。

Python没有块作用域变量。相反,它有函数作用域、类作用域和全局作用域

换句话说,函数中任何地方初始化的变量都可以在该点之后访问。例如:

for x in range(2):
    pass
print(x) # <--- x is accessible
范围(2)内x的
:
通过

print(x)#Python没有块作用域变量。相反,它有函数作用域、类作用域和全局作用域

换句话说,函数中任何地方初始化的变量都可以在该点之后访问。例如:

for x in range(2):
    pass
print(x) # <--- x is accessible
范围(2)内x的
:
通过
打印(x)#LEGB规则
所谓的立法局规则就是这样说的。之所以称之为LEGB,是因为其优先级为:

本地的→ 随函附上的→ 全球的→ 内置的

Python中的变量范围可以是:

  • Local:未在函数中声明为全局或赋值的变量
  • Enclosing:在一个函数中定义的变量被包装在另一个函数中
  • Global:声明为全局的变量,或在文件的顶层分配的变量
  • B内置:在内置名称模块中预先分配的变量

在您的示例中:
d
是可访问的,因为
for
循环没有标记新的作用域,但如果它标记了:

def noaccess():
    for i in range(4):
        d = i * 2
noaccess()
print(d)
Python说
NameError:没有定义名称“d”

LEGB规则 所谓的立法局规则就是这样说的。之所以称之为LEGB,是因为其优先级为:

本地的→ 随函附上的→ 全球的→ 内置的

Python中的变量范围可以是:

  • Local:未在函数中声明为全局或赋值的变量
  • Enclosing:在一个函数中定义的变量被包装在另一个函数中
  • Global:声明为全局的变量,或在文件的顶层分配的变量
  • B内置:在内置名称模块中预先分配的变量

在您的示例中:
d
是可访问的,因为
for
循环没有标记新的作用域,但如果它标记了:

def noaccess():
    for i in range(4):
        d = i * 2
noaccess()
print(d)

Python说
NameError:name'd'没有定义

比较两种具有不同语义规则的不同语言是毫无意义的。在PROLOG中甚至不能有一个名为
d
的变量。。所以?C给了你一个选项,在循环外声明一个变量,然后在循环内引用它。相比之下,Python根本没有声明——因此,如果Python遵循您提出的规则,就不可能让块内的内容为其范围超出该块的变量设置初始值。我认为我称之为荒谬的结果并不过分,因此你所期望的语法表面上是不合理的(除非你也将语言更改为不再有可能从外部范围隐藏变量名,但这也是一个相当重要的更改)比较两种具有不同语义规则的不同语言是毫无意义的。在PROLOG中,甚至不能有一个名为
d
的变量。。所以?C给了你一个选项,在循环外声明一个变量,然后在循环内引用它。相比之下,Python根本没有声明——因此,如果Python遵循您提出的规则,就不可能让块内的内容为其范围超出该块的变量设置初始值。我认为我称之为荒谬的结果并不过分,因此你所期望的语法表面上是不合理的(除非你也将语言更改为不再可能从外部作用域中隐藏变量名,但这也是一个相当重要的更改)。你的陈述有一个例外“函数中任何地方初始化的变量都可以在该点之后访问”。由于Python 3.x,理解中使用的变量仅在理解范围内有效:
[x代表范围内的x(10)];print(x)
会引发
NameError
(在Python 2.7中,这会输出
9
)。您的语句有一个例外。”函数中任何地方初始化的变量都可以在该点之后访问”。由于Python 3.x,理解中使用的变量仅在理解中有效:
[x代表范围(10)];print(x)
会引发
NameError
(在Python 2.7中,这会输出
9
)。