python 中变量名和函数名冲突

2023-11-27

假设我有以下功能:

def xplusy(x, y):
    return x+y

def xplus1(x):
    xplusy = xplusy(x, 1)
    return xplusy

现在如果我打电话a = xplus1(4)它抛出以下错误:

UnboundLocalError: local variable 'xplusy' referenced before assignment

错误是因为命名冲突,如果我重新定义xplus1如下:

def xplus1(x):
    s = xplusy(x, 1)
    return s

效果很好。

为什么会这样:编译器无法正确区分变量和函数调用?

有什么办法解决吗?


在 Python 中,函数是数据,而类型是动态的。这意味着以下行是有效的 Python:

def func(x):
    return x + 3

func = 3

func现在是一个整数。原来的功能func不再引用。事实是func最初是一个函数,与将来可以分配给它的数据类型无关。 (这就是“动态类型”的含义。)

因此,由于没有静态类型,并且“函数”是有效的数据类型,因此 Python 解释器区分函数和同名引用的数据是没有意义的。因此,在给定范围内,无法使用相同的非限定变量名来表示两个不同的事物。

在您的特定情况下,如果您的代码xplus1函数意味着任何东西,它意味着“计算xplusy(x,1)并分配该值到变量xplusy——从而失去了对function xplusy。”但是,在函数的作用域内,解释器不会让您对该作用域之外的变量进行赋值,因此它假设通过编写赋值语句,您正在引入一个新的局部变量xplusy。然而,局部变量尚未定义,因此您尝试调用它,xplusy(x,1),失败。全局定义的函数不会作为后备调用,因为同样,您不能让两个非限定名称相同并指向同一范围内的不同数据。


另一个例子演示了“一个范围内变量名不重复”的规则(实际上我只是在尝试构造这个答案时使用提示时才发现的):

>>> def f1():
...     a = xplusy(3,4)
...     xplusy = 5
...     print xplusy
...
>>> f1()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in f1
UnboundLocalError: local variable 'xplusy' referenced before assignment
>>> def f1():
...     a = xplusy(3,4)
...     print a
...
>>> f1()
7

这证明它确实是scope,不是陈述这需要唯一的名称。


编辑:这是一篇非常酷的帖子,解释了这个以及其他与范围相关的行为:http://me.veekun.com/blog/2011/04/24/gotcha-python-scoping-closures/

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

python 中变量名和函数名冲突 的相关文章

  • 为什么我不能导入 geopandas?

    我唯一的代码行是 import geopandas 它给了我错误 OSError Could not find libspatialindex c library file 以前有人遇到过这个吗 我的脚本运行得很好 直到出现此错误 请注意
  • 在 Python 中使用 XPath 和 LXML

    我有一个 python 脚本 用于解析 XML 并将某些感兴趣的元素导出到 csv 文件中 我现在尝试更改脚本以允许根据条件过滤 XML 文件 等效的 XPath 查询将是 DC Events Confirmation contains T
  • 如何更改充当按钮的范围的文本

    我正在为自定义 Web 应用程序编写自动化测试 我遇到了无法更改跨度文本的问题 我尝试过使用 driver execute script 但没有运气 如果我更好地了解 javascript 这确实会有帮助 据我所知 您无法单击跨度 并且列表
  • Dask DataFrame 的逐行处理

    我需要处理一个大文件并更改一些值 我想做这样的事情 for index row in dataFrame iterrows foo doSomeStuffWith row lol doOtherStuffWith row dataFrame
  • 将 subprocess.Popen 的输出通过管道传输到文件

    我需要启动一些长时间运行的进程subprocess Popen 并希望拥有stdout and stderr从每个自动管道到单独的日志文件 每个进程将同时运行几分钟 我想要两个日志文件 stdout and stderr 每个进程当进程运行
  • 当x轴不连续时如何删除冗余日期时间 pandas DatetimeIndex

    我想绘制一个 pandas 系列 其索引是无数的 DatatimeIndex 我的代码如下 import matplotlib dates as mdates index pd DatetimeIndex 2000 01 01 00 00
  • Python:随时接受用户输入

    我正在创建一个可以做很多事情的单元 其中之一是计算机器的周期 虽然我将把它转移到梯形逻辑 CoDeSys 但我首先将我的想法放入 Python 中 我将进行计数 只需一个简单的操作 counter 1 print counter 跟踪我处于
  • Python 中的这种赋值方式叫什么? a = b = 真

    我知道关于元组拆包 http docs python org tutorial datastructures html tuples and sequences但是当一行中有多个等号时 这个赋值被称为什么 阿拉a b True 它总是让我有
  • 在 Mac 上安装 Pygame 到 Enthought 构建中

    关于在 Mac 上安装 Pygame 有许多未解答的问题 但我将在这里提出我的具体问题并希望得到答案 我在 Mac 上安装 Pygame 时遇到了难以置信的困难 我使用 Enthought 版本 EPD 7 3 2 32 位 它是我的默认框
  • 字典中列表中仅有的几个索引的总和

    如果我有这种类型的字典 a dictionary dog white 3 5 black 6 7 Brown 23 1 cat gray 5 6 brown 4 9 bird blue 3 5 green 1 2 yellow 4 9 mo
  • 使用 python 将文本发送到带有逗号分隔符的列

    如何使用分隔符 在 Excel 中将一列分成两列 并使用 python 命名标题 这是我的代码 import openpyxl w openpyxl load workbook DDdata xlsx active w active a a
  • FastText - 由于 C++ 扩展未能分配内存,无法加载 model.bin

    我正在尝试使用 FastText Python APIhttps pypi python org pypi fasttext https pypi python org pypi fasttext虽然 据我所知 此 API 无法加载较新的
  • ValueError:无法插入 ID,已存在

    我有这个数据 ID TIME 1 2 1 4 1 2 2 3 我想按以下方式对数据进行分组ID并计算每组的平均时间和规模 ID MEAN TIME COUNT 1 2 67 3 2 3 00 1 如果我运行此代码 则会收到错误 ValueE
  • 在谷歌C​​olab中使用cv2.imshow()

    我正在尝试通过输入视频来对视频进行对象检测 cap cv2 VideoCapture video3 mp4 在处理部分之后 我想使用实时对象检测来显示视频 while True ret image np cap read Expand di
  • Python Flask 是否定义了路由顺序?

    在我看来 我的设置类似于以下内容 app route test def test app route
  • 是否可以写一个负的python类型注释

    这可能听起来不合理 但现在我需要否定类型注释 我的意思是这样的 an int Not Iterable a string Iterable 这是因为我为一个函数编写了一个重载 而 mypy 不理解我 我的功能看起来像这样 overload
  • asyncio - 多次等待协程(周期性任务)

    我正在尝试为异步事件循环创建定期任务 如下所示 但是我收到 RuntimeError 无法重用已等待的协程 异常 显然 asyncio 不允许等待相同的可等待函数 如中讨论的这个错误线程 https bugs python org issu
  • 将 Scikit-Learn OneHotEncoder 与 Pandas DataFrame 结合使用

    我正在尝试使用 Scikit Learn 的 OneHotEncoder 将 Pandas DataFrame 中包含字符串的列替换为 one hot 编码的等效项 我的下面的代码不起作用 from sklearn preprocessin
  • PyQt 中的线程和信号问题

    我在 PyQt 中的线程之间进行通信时遇到一些问题 我使用信号在两个线程 发送者和监听者 之间进行通信 发送者发送消息 期望被监听者接收 但是 没有收到任何消息 谁能建议可能出了什么问题 我确信这一定很简单 但我已经环顾了几个小时但没有发现
  • 将此 MATLAB 代码转换为 Python 时我做错了什么?

    我正在努力将生成波形的 MATLAB 代码转换为 Python 就上下文而言 这是原子力显微镜带激发响应的模拟 与代码错误无关 在 MATLAB 中从 r vec 生成的图形与我在 Python 中生成的图形不同 我是否正确地将 MATLA

随机推荐

  • 可移动/可拖动

    这是我更新和修改的脚本 它完全可以工作 除了我想通用它 观察 我怎样才能做到这一点 这样我就不必这样做function e BOX Draggable elemen e target e srcElement elementDraggabl
  • Jenkins:在 MultiJob 中共享变量

    我使用 Jenkins 进行测试 构建 因此我使用以下配置创建了一个 MultiJob 项目 Test Job 建立工作 安装工作 MultiJob 从 Master Jenkins 启动 但其他作业从其他 Node 启动 构建作业执行创建
  • DVCLAL 的所有可能值的列表是什么?

    当我遇到这个函数时 我正在阅读 SysUtils function ALR Pointer var LibModule PLibModule begin if MainInstance lt gt 0 then Result Pointer
  • sql触发器打印消息

    我是在数据库中使用触发器的新手 我创建了一些对我来说非常有效的触发器 除了当我尝试创建一个在删除行后显示一条消息的触发器时 我尝试使用这段代码 ALTER TRIGGER mycustomerTrigger AFTER delete ON
  • 如何在 git 中查看传入的提交? [复制]

    这个问题在这里已经有答案了 可能的重复 使用 Git 如何在本地和远程之间查找修改过的文件 如何在 git 中查看传入的提交 或者甚至更好 看看我刚刚说的git fetch git pulled Edit 为了澄清这个问题 有人告诉我 为了
  • 为什么 JVM 不缓存 JIT 编译的代码?

    Sun 的规范 JVM 实现对字节码应用了一些相当复杂的优化 以便在代码运行几次后获得接近本机的执行速度 问题是 为什么不将此编译后的代码缓存到磁盘以供后续使用同一函数 类时使用 按照目前的情况 每次执行程序时 JIT 编译器都会重新启动
  • 用于图像去模糊的维纳滤波器

    我正在尝试实现维纳滤波器来对模糊图像执行反卷积 我的实现是这样的 import numpy as np from numpy fft import fft2 ifft2 def wiener filter img kernel K 10 d
  • 使用 JfreeChart 动态向 XYSeries 添加点

    我在向 XYSeries 添加点时遇到问题 我有两节课 一是Sample 它有一个main方法 另一个类是JfreeChart 它有JfreeChart代码 在我的Sample类我有一个二维数组sample row 2 最初有 10 行 然
  • 如何检查 double 是否最多有 n 位小数?

    目前我有这个方法 static boolean checkDecimalPlaces double d int decimalPlaces if d 0 return true double multiplier Math pow 10 d
  • android 出现所有包无法下载的错误

    所有软件包均不提供下载 以下软件包不可用 包 ID 来源 android 24 我尝试使用 Web 服务从数据库获取数据 但运行应用程序时出现上述错误 如何在 android studio 中解决这个问题 弹出错误与您在应用程序中遇到的异常
  • 在C中获取LAN上的设备列表

    我想获取连接到我的本地网络的可用设备列表 它们的 IP 地址或主机名应该没问题 我有一些 C 示例 但找不到任何使用 C C 的示例 我熟悉 BSD 套接字 API 只是为了澄清一下 我有一个 存根 的想法 也许我应该确定 LAN 上的设备
  • 为什么不能将镜头类型更改为使用任何 Integral?

    take Int gt a gt a genericTake Integral i gt i gt a gt a 我读过不方便的类型take这是由于历史原因 更改它可能会导致某些代码损坏 但我不能更换吗take with genericTa
  • 梯度下降代码的向量化

    我正在 Matlab 上实现批量梯度下降 我的更新步骤有问题theta theta是两个分量 两行 的向量 X是一个矩阵 包含m行 训练样本数 和n 2列 特征数量 Y 是一个m行向量 在更新步骤中 我需要设置每个theta i to th
  • 在C++程序中使用mat文件

    请 谁能帮我 我有 Mat 文件包含特征向量数组结构 我需要在 C 程序中使用此文件 如何在我的 C 程序中加载该文件 你可以尝试matio图书馆 它至少支持版本 5 的 mat 文件 我认为是压缩和结构 也许还有更新的东西 看来正在积极开
  • 打包 Streamlit 应用程序并在 Windows 上运行可执行文件

    这是我在 Stackoverflow 上的第一个问题 我希望我的问题很清楚 否则请告诉我 并随时向我询问更多详细信息 我正在尝试为个人项目打包一个 Streamlit 应用程序 我正在 Linux 下开发 但我必须在 Windows 上部署
  • Kivy CheckBox 看起来像实心黑盒子(不是复选框)

    我正在制作一个 BoxLayout 小部件 方向 水平 其中包含三个小部件 一个标签 一个文本框和一个复选框 thisRow BoxLayout orientation horizontal l Label text Enter plate
  • WorkbenchJ - 错误:GROUP BY 子句中不允许聚合

    我在网站上发现了一些其他带有此错误消息的线程 但那里的解决方案似乎对我不起作用 这是我试图运行的查询 SELECT o name as Name o vrank tav c as Vrank COUNT c enterprise id AS
  • std::thread 创建抛出异常

    Code include
  • 当用户完成输入而不是按键时运行javascript函数?

    我想当用户在文本框中输入完毕后触发 ajax 请求 我不希望它在每次用户输入字母时运行该函数 因为这会导致大量的 ajax 请求 但我也不希望他们必须点击 Enter 按钮 有没有办法让我可以检测用户何时完成输入 然后执行ajax请求 这里
  • python 中变量名和函数名冲突

    假设我有以下功能 def xplusy x y return x y def xplus1 x xplusy xplusy x 1 return xplusy 现在如果我打电话a xplus1 4 它抛出以下错误 UnboundLocalE