- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
来自Python FAQ ,我们可以读到:
In Python, variables that are only referenced inside a function are implicitly global
并且来自 Python Tutorial on defining functions ,我们可以读到:
The execution of a function introduces a new symbol table used for the local variables of the function. More precisely, all variable assignments in a function store the value in the local symbol table; whereas variable references first look in the local symbol table, then in the local symbol tables of enclosing functions, then in the global symbol table, and finally in the table of built-in names
现在我完全理解了教程中的陈述,但是说仅在函数内部引用的变量是隐式全局变量
对我来说似乎很模糊。
如果我们实际上开始查看局部符号表,然后再查看更“通用”的符号表,为什么说它们是隐式全局的呢?这是否只是一种说法,如果您只打算在函数中引用一个变量,则无需担心它是本地变量还是 global
?
最佳答案
(进一步查看摘要)
这意味着如果一个变量在函数体中从未分配给,那么它将被视为全局变量。
这解释了为什么以下工作(a
被视为全局):
a = 1
def fn():
print a # This is "referencing a variable" == "reading its value"
# Prints: 1
但是,如果变量被分配给函数体中的某处,那么它将被视为局部对于整个函数体。
这包括在分配给它之前找到的语句(参见下面的示例)。
这解释了为什么以下内容不有效。此处,a
被视为本地,
a = 1
def fn():
print a
a = 2 # <<< We're adding this
fn()
# Throws: UnboundLocalError: local variable 'a' referenced before assignment
您可以让 Python 使用语句 global a
将变量视为全局变量。如果您这样做,那么该变量将被视为全局变量,对于整个函数体也是如此。
a = 1
def fn():
global a # <<< We're adding this
print a
a = 2
fn()
print a
# Prints: 1
# Then, prints: 2 (a changed in the global scope too)
与您可能期望的不同,如果在本地范围内找不到 a
,Python 将不会回退到全局范围。
这意味着一个变量对于整个函数体来说要么是局部的要么是全局的:它不能是全局的然后变成局部的。
现在,关于一个变量是被视为局部变量还是全局变量,Python 遵循以下规则。变量是:
global
语句则为全局global
),则为局部事实上,“隐式全局”并不真正意味着全局。这是一种更好的思考方式:
因此,如果一个变量是“隐式全局”(==“函数外部”),那么它的“封闭范围”将首先被查找:
a = 25
def enclosing():
a = 2
def enclosed():
print a
enclosed()
enclosing()
# Prints 2, as supplied in the enclosing scope, instead of 25 (found in the global scope)
现在,像往常一样,global
允许您引用全局范围。
a = 25
def enclosing():
a = 2
def enclosed():
global a # <<< We're adding this
print a
enclosed()
enclosing()
# Prints 25, as supplied in the global scope
现在,如果您需要在 enclosed
中分配给 a
,并且希望在 enclosed 中更改
的范围,但不在全局范围内,那么您将需要 a
的值nonlocal
,这是 Python 3 中的新功能。在 Python 2 中,您不能。
关于 python : Why is it said that variables that are only referenced are implicitly global?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23458854/
我不确定这个语法是否是 Informix 特有的,但是我在创建触发器时遇到了麻烦,直到我找到了一些包含这些行之一或两者的语法: CREATE TRIGGER accuplacer_trig
我是 Android Studio 和 gradle 的新手。我有一个 Android 项目,部分在 Eclipse 中工作。原始代码在Android中使用derby数据库。旧代码通过 JDBC 直接
我对以下示例中的行为感到困惑。我在一个项目中偶然发现了这个问题,我花了几个小时将问题缩小到一个简单的例子。所以这是我的简单测试类: 'John']]; public function inf
我在 pgAdmin 4 中创建了一些表,但由于某种原因我一直收到标题错误,你能找出原因吗?我没有看到任何问题,并且我已经查看了与我的代码示例相似的其他代码示例,这些示例编译得很好。它在 IDEone
我正在创建一个表,但出现此错误: number of referencing and referenced columns for foreign key disagree. 不知道怎么解决。我认为声
假设我有一个名为“C”的库 (.NETStandard 2.0),它定义了一个名为“CRecord”(记录)的类型。 假设我从名为“B”的 .NET 4.7.2 库中使用这个库。有一个使用“CReco
我已经尝试解决这个错误几分钟了,但我不知道表定义中缺少什么。 表格的代码如下: 表Autocare: CREATE TABLE [dbo].[Autocare] ( [IDAutocar]
DROP DATABASE IF EXISTS ProviderPatients; CREATE DATABASE ProviderPatients; USE ProviderPatients; CR
假设我有这个表stuff_property: | stuff_id (fk) | property_id | | ------------- | ----------- | 现在我想要进行查询,该查询
我是 MySQL 的新手。我完全有能力进行查询和创建表,但之前从未尝试过触发器。 CREATE TRIGGER TrigMora AFTER INSERT ON cliente REFEREN
我可以创建一个具有四个这样的属性的对象 $pocketKnife = New-Object PSObject -property @{ Color = 'Black' Weight =
我有一个名为 App 的对象,它包含主干应用程序的所有相关部分。 问题:当我从应用程序中的其他对象调用应用程序中的对象时,它们是未定义的。 我认为发生这种情况是因为在定义其自身的 App 对象之前,它
我有一个ArrayClass并且mergeSortArray扩展了它。并且 mergeSortArray 包含一个 mergeSort() 方法。但是,由于我使用 super 从父类(super cl
public class foo{ private String label; foo(String whereto){ label = whereto; } publi
我正在尝试以编程方式将库添加到引用的库中。这是我的代码: String filename = "myfile.jar"; InputStream is; try { is = new Buffe
我使用@Reference来获取我需要的所有信息: 吗菲亚: Query query = INSTANCE.createQuery(User.class); return query.asLi
我在 eclipse 中有一个 Java 项目,我想在其中添加 3 个 jar 文件到构建路径: 但是,当我选择它们并将它们添加到构建路径(右键单击/构建路径/添加到构建路径)时,它们将与成为类的“j
希望获得 Java 遵循的一些幕后内存引用和规则。 这是一段代码。基本上,此类用于实例化一些其他对象 (MyOtherObject),然后将此对象的 doClose() 方法的引用发送到 Vector
我打开了this关于转发引用的帖子,这是一个(希望如此)MCVE 代码: #include #include using namespace std; struct MultiMemoizator
MySQL 表: categoryID categoryName categoryParent 每个类别都有一个父类别,尽管它可以是 NULL,我将其视为根类别。 我想从表中获取所有类别,将其存储
我是一名优秀的程序员,十分优秀!