Python 中如何确定范围[重复]

2023-12-11

为什么第二个函数中的第一个 print 语句会抛出错误x没有定义?

x = 5

def function_a():
    print(x)


def function_b():
    print(x)
    x = 7
    print(x)

运行第一个函数会得到以下结果。

>>> function_a()
5

运行第二个函数时会抛出错误。

UnboundLocalError: local variable 'x' referenced before assignment

Python 会infer并在看到作用域内声明的变量时使用内部作用域中的变量,即使该变量是在使用后声明的.

为了演示这一点,我创建了两个场景。


内部作用域内声明的变量

变量按以下顺序推断:局部变量、非局部变量和全局变量。自从x在内部作用域内声明,Python 将推断并使用x在此范围内,即使它是在使用后声明的。

注意Python无法区分修改 from 宣言;本来想修改什么x来自全局范围的被解释为声明另一个变量x那个范围之内。

Inferred Inner

内部作用域内没有声明变量

如果内部作用域内没有声明变量,Python 会将推断作用域切换为非局部作用域,然后切换为全局作用域。

Inferred Global

显式切换范围

如果您明确声明了范围x事先,Python 不必进行推断。

Declared Global

下面的代码不会抛出错误,因为它使用的作用域明确是全局作用域而不是内部作用域。

x = 5

def scope():
    global x
    print(x)
    x = 7
    print(x)

Scopes

通过选择要使用的范围,您不仅可以using该特定范围内的变量,而且修改变量。因此,在处理范围时需要格外小心。

因为Python无法区分变量声明 from 变量修改,我的建议是,如果你想使用全局变量,你应该事先明确声明它。

这也适用于嵌套范围。

x = 5

def outer():
    x = 7

    def inner():
        nonlocal x
        print(x)
        x = 3
        print(x)
    
    inner()

运行外部函数会得到以下结果。

>>> outer()
7
3

尝试改变nonlocal关键字到global并看到不同的结果;或者完全删除该行会出现错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 中如何确定范围[重复] 的相关文章

  • Python 使用 ssl.getpeercert() 从 URL 获取通用名称

    我正在尝试获取证书颁发者信息 通用名称 但链接中的代码不适用于某些 URL 如何在 python 中获取证书颁发者信息 https stackoverflow com questions 30862099 how can i get cer
  • 如果文件不存在,使用 python 添加一行

    我有一个 xml 文件如下
  • 动态添加字段到数据类对象

    我正在编写一个库来访问 REST API 它返回带有用户对象的 json 我将其转换为 dict 然后将其转换为数据类对象 问题是并非所有字段都是固定的 我想动态添加其他字段 未在我的数据类中指定 我可以简单地为我的对象分配值 但它们不会出
  • ModuleNotFoundError:pip install后没有名为“requests”的模块[重复]

    这个问题在这里已经有答案了 我知道以前曾有人问过类似的问题 但我找不到问题的解决方案 尝试导入请求后 我收到以下错误消息 C Users Jm PycharmProjects Test venv Scripts python exe C U
  • ValueError:展开时包装器循环

    我的示例代码中的 Python3 测试用例 文档测试 失败 但在 Python2 中同样可以正常工作 test py class Test object def init self a 0 self a a def getattr self
  • 从 colab 中的驱动器中的 python 脚本导入 python 模块

    我目前正在 Google Colab 上开展一个使用 Tensorflow API 的机器学习项目 我创建了一个文件夹并将其上传到谷歌驱动器上以在谷歌Colab上运行 我成功安装了谷歌驱动器并可以运行脚本 但是当我尝试从同一文件夹中的脚本导
  • Google Cloud Functions 中的 Python

    Google Cloud Functions 可以使用 sklearn pandas 等包处理 python 吗 如果是这样 有人可以向我指出如何做到这一点的资源方向 我已经搜索了一段时间 似乎这是不可能的 我找到的只是将基本 python
  • Django 星级评定系统和 AJAX

    我正在尝试在 Django 网站上实现星级评级系统 在我的模型中存储评级是排序的 就像在页面上显示分数一样 但我希望用户能够对页面进行评分 基本上从 1 到 5 而无需刷新或更改页面 我发现了以下内容 并且喜欢这里明星的风格 http jv
  • Sendmail Errno[61] 连接被拒绝

    我一直在尝试让我的应用程序将一些输出的文本邮寄到电子邮件中 为了简单起见 我隔离了脚本 import smtplib import sys import os SERVER localhost FROM os getlogin TO raw
  • pytest动态生成测试方法

    您好 我如何为列表或文件数量动态生成测试方法 假设我有 file1 file2 和 filen 其输入值为 json 现在我需要对多个值运行相同的测试 如下所示 class Test File unittest TestCase def t
  • ctypes c_char_p 的不同行为?

    我对不同版本的 python 的这种行为感到困惑 不明白为什么 Python 2 7 5 default Aug 25 2013 00 04 04 GCC 4 2 1 Compatible Apple LLVM 5 0 clang 500
  • 根据另一个参数的值添加参数

    根据输入之一 我想初始化某些对象 这些对象的值将是其余参数的默认值 因此 即使在 parser parse args 之前 我也需要参数之一的值 我如何使用 python argparse 模块来实现这一点 所有选项都将作为一个命令行给出
  • Numpy 附加到一个空数组

    第一种情况 gt gt gt import numpy as np gt gt gt x np array 0 gt gt gt x np append x 1 gt gt gt x array 0 1 x包含 2 个元素 这是为什么 第二
  • python中使用argsort进行排序

    我尝试对数组进行排序 import numpy as np arr 5 3 7 2 6 34 46 344 545 32 5 22 print unsorted print arr np argsort arr print sorted p
  • 在unittest.main()之后执行命令

    我从另一个 Python 脚本调用以下脚本 测试 py 日志文件 它应该运行测试并将结果保存在日志文件中 但由于某种原因 之后的命令unittest main testRunner runner 没有被执行 我什至不确定文件写入后是否会关闭
  • Jinja2 为 Google App Engine 模型返回“None”字符串

    Google App Engine 模型 如下所示 from google appengine ext db import Model class M Model name db StringProperty 然后在从 Django 视图调
  • Pandas .apply() 函数中的异常处理

    如果我有一个数据框 myDF DataFrame data 11 11 22 2A 33 33 columns A B 给出以下数据帧 从 stackoverflow 开始 对于数据帧的图像没有足够的声誉 A B 0 11 11 1 22
  • Python递归限制与堆栈大小?

    我了解递归中每个递归调用如何堆栈在堆栈上 如果超出堆栈限制 则会出现堆栈溢出 那么为什么Python的sys getrecursionlimit 返回一个数字 递归调用的最大深度 这不取决于我在该递归函数中所做的事情吗 或者它是否以某种方式
  • Python BeautifulSoup 循环表数据

    这里对 Python 非常陌生 我正在尝试从此页面捕获一些数据这一页 https us diablo3 com en item helm 我正在尝试获取两个列表中捕获的项目名称和项目类型 我稍后可以弄清楚如何将它们连接到一张表中 任何帮助都
  • 一旦相关命令更改,如何自动运行 py.test?

    通过autonose或nosy 一旦某些测试文件或相关文件发生更改 它将自动运行nosetests 请问py test是否提供了类似的功能 有没有其他工具可以自动激发py test 您可以安装pytest xdist 插件 http pyp

随机推荐

  • CSS:我无法将宽度设置为“自动”始终显示 100%

    因为某些原因 div 的宽度是 100 如果我将其设置为 auto 则不会发生任何变化 尝试过display block 但还是什么都没有 我有什么index html box border 1px solid 555 display bl
  • 自己的CollectionView用于分页、排序和过滤

    我已经实现了自己的 CollectionView 将数据集合绑定到 WPF 中的 DataGrid 主要目标是分页 效果很好 我编写了以下 C 代码 public class SchemesCollectionView Collection
  • java中的除法

    我用Java做了一个简单的划分 float f 19 7f 100 System out println f 0 19700001 double d 19 7 100 System out println d 0 1969999999999
  • 如何强制网站打印

    这听起来像是一个奇怪的请求 但是 我有一个 Web 应用程序 它设置为定期收集数据并将其存储到数据库中 该应用程序被设计为基本上始终保持打开状态 并且屏幕显示最近添加到数据库中的内容 通过使用ajax检查数据库并在有新内容时刷新页面 每当将
  • Nokogiri 以字符串形式返回值,而不是数组

    我正在使用 Nokogiri 运行一个返回多个值的脚本 我的印象是 并且通过多个来源向我保证 结果应该采用数组的形式 相反 我得到了一根看起来很难看的绳子 这是代码 require nokogiri require open uri req
  • MongoDB 将相关集合项计数与其他集合结果合并

    我是 mongodb 的新手 并试图弄清楚如何有效地查询集合中的每个项目 I have projects收藏 tasks收藏品 projects id ObjectId name String tasks id ObjectId proje
  • alignItems =“flex-end”不适用于 onContentSizeChange

    无论文本区域如何扩展 我都试图将角图标固定在屏幕底部 我尝试过position absolute and bottom 0但它隐藏在我的背后textArea 这是现在的样子 这就是我要的 我只需要修复发送并将图像图标添加到屏幕的底角 请指导
  • 如果路径包含主目录波浪号,Python 子进程不会执行 ~

    我正在尝试检测错误并从 django 应用程序重新启动服务器 我正在使用以下代码 try do something except print here subprocess call home my username restart sh
  • 在 Heroku Cedar 上为 Rails 中的资源设置自定义标头

    我有一个使用 Rails 4 0 和资产管道的 cedar 应用程序 我想为资产管道中的所有资产设置自定义标头 如何才能做到这一点 一个简单的方法是使用机架插件 如下所示 class RackAssetFilter def initiali
  • 生成的签名 X.509 客户端证书无效(没有指向其 CA 的证书链)

    我使用 Bouncy Castle 生成 X 509 客户端证书 并使用已知的 CA 来签署它们 首先 我从证书存储中读取 CA 证书 生成客户端证书 并使用 CA 对其进行签名 由于以下问题 证书验证失败 无法为受信任的根颁发机构构建证书
  • Android 中的视图翻转器可以有多少个视图?

    我正在 Android 中开发一个应用程序 我想在其中显示大约 170 张图像 但我希望用户可以通过手指向右或向左查看图像 从互联网上搜索后我得到了一个解决方案 因此我在我的应用程序中使用了View Flipper 当图像计数为15时它将起
  • Matlab向矩阵添加额外的列

    我有一个大小为 216 x 3 的矩阵 我希望向该矩阵添加额外的三列 我认为很简单的事情让我发疯 我原以为它会像下面这样 myData myData zeros length myData 1 3 错误消息如下 然而 两个矩阵具有相同的行数
  • 执行与 Oracle 的连接时,“安全包中没有可用的凭据”

    上次 Windows 更新后 执行与 Oracle 数据库的连接的测试启动失败 并出现 AuthenticationException 下面提供了消息和堆栈跟踪
  • 标签之间的正则表达式,除非转义

    我围绕 Pygments 库制作了一个 PHP 包装器 突出显示代码块 用于代码块检测的正则表达式可以在配置文件 json格式 json 值看起来像这样 codeblock regex pygments pygments JSON 解码后应
  • 如何防止R中的科学记数法? [复制]

    这个问题在这里已经有答案了 我的图以 e 表示法的形式显示 y 轴上的值 我应该使用哪个命令来获取数字形式的值 文件中使用的值是数字形式吗 谢谢 要在整个 R 会话中设置科学记数法的使用 您可以使用scipen选项 从文档 options
  • C++ 后台定时器

    include stdafx h include
  • 如果关系不存在则返回节点

    我正在尝试使用 cypher 创建一个查询 它将 查找 厨师可能拥有的缺失成分 我的图表设置如下 ingredient value is part of gt ingredient ingredient 将有一个名称 染料颜色 的键 值 i
  • Symfony2 登录和安全

    有没有办法可以存储用户上次登录的时间 我正在使用 symfony2 安全配置一切正常 我见过这个基于 Symfony 2 的项目的安全性和登录 这是一个类似的问题 但它不符合我的需要 还有其他解决办法吗 您可以创建一个Authenticat
  • C# HttpClient 和 API

    我有一个 Web 应用程序 它使用 HttpClient 类从 API 中提取数据 我有几个问题 HttpClient 是从 API 获取数据的最佳选择吗 我从 APi 获取一个字符串并将其反序列化为一个对象 每次使用时都会创建 HttpC
  • Python 中如何确定范围[重复]

    这个问题在这里已经有答案了 为什么第二个函数中的第一个 print 语句会抛出错误x没有定义 x 5 def function a print x def function b print x x 7 print x 运行第一个函数会得到以