在Python中通过引用传递引用

2024-05-04

python 中是否可以通过引用传递引用?在C++中,可以通过向数据传递指针来模仿Python传递数据的模型:指针按值传递,函数可以更改它指向的任何内容,但函数不能更改指针的值。但是,在 C++ 中,您还可以传递对指针的引用,在这种情况下,您可以修改指针值及其指向的内容。

我想到的是以下 C++ 代码片段的类似内容,

#include <iostream>

int k=5;

void fun(int * &p)
    {
    p=&k;
    }

int main()
    {
    int i=3;
    int *p = &i;

    std::cout << *p << std::endl;
    fun(p);
    std::cout << *p << std::endl;
    }

该函数改变传入的指针p的值;输出是“3”和“5”。

如果我在上面的函数声明中删除“&”,我会得到类似于以下 python 代码片段的内容:

def fun(p):
    p=5

p=3
print p
fun(p)
print p

其中打印 3 两次,因为 fun 无法更改主体中“引用”p 的值。有什么办法可以得到上面 C++ 中的行为吗?

(为了完整性:我知道python的数据传递模型与按值传递指针不同,因为你不需要在函数内显式地取消引用它。它更像是按值传递引用。但是,我不能写上面的 C++ 示例通过引用传递引用,因为 C++ 不允许我更改引用。所以请忽略该差异)。


你不能。Python是按赋值传递的 http://docs.python.org/3/faq/programming.html#how-do-i-write-a-function-with-output-parameters-call-by-reference

替代解决方案是提供类的实例或可变容器,但从长远来看这些都是坏主意,最好再次返回值并通过将返回值分配给全局变量来修改全局变量。

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

在Python中通过引用传递引用 的相关文章

随机推荐

  • git merge,保留两者

    为了合并 我用它来 保留我的 git merge X ours foo 这是 保留他们的 git merge X theirs foo 然而 在我最近的合并中 看起来最好保留双方 Git 是否有一个 策略 来避免手动编辑文件 没有解决这些冲
  • jQuery 添加和删除类

    我有这个选择器
  • 双击选项卡控制标题

    一段时间以来我一直想知道这个问题 双击 winforms TabControl 的标题没有被检测到 但我想处理这个事件 看起来所有鼠标事件 单击 移动等 在 TabControl 的 非活动 区域上时都不会引发 我什至尝试过对 TabCon
  • 从文本文件中读取丹麦语字符

    我正在尝试读取包含一些丹麦语字符的文本文件 我找到了几种使用不同类型的编码来完成此操作的方法 但我看到的示例仅读取一个文件 这是我到目前为止所拥有的 search directory for all txt files foreach st
  • 如何更改 max_allowed_pa​​cket 大小

    我的 MySQL 数据库中的 BLOB 字段出现问题 上传大于约 1MB 的文件时出现错误Packets larger than max allowed packet are not allowed 这是我尝试过的 在 MySQL 查询浏览
  • 永远不应该触发嵌套优化。这可能是由于 NSISVariable 委托回调内部发生自动布局工作

    应用程序崩溃了 日志给了我这条消息 永远不应该触发嵌套优化 这可能是由于自动布局工作发生在 NSISVariable 委托回调内 这是不允许的 如何解决这个问题 认为我正在后台线程中更新 UI 尝试放置 if NSThread isMain
  • 带有自定义按钮的 ExtJs 消息框

    如何使用自定义按钮显示 ExtJS 消息框 我想要一个带有自定义消息以及 取消 和 停用 按钮的消息框 请给一些想法 buttons text Cancel handler function Ext MessageBox hide subm
  • 创建应用程序:无法初始化 ORM

    当我启动节点时 我总是收到此错误 请回复我我哪里出错了 错误 创建应用程序 无法初始化 ORM initializeORM NewORM 无法初始化 DB 无法打开 application name Chainlink 0 10 7 7C
  • 比较 Swift 中的 AnyObjects,无需将它们转换为特定类型

    尝试使用 Equatable 协议中定义的 运算符来比较 AnyObject 类型的两个对象会导致 Swift 中出现编译错误 有没有人找到一种方法来比较这些对象 而不知道可用于向下转换的对象的真实类型 这个问题的背景是我有一个字典 Dic
  • Cordova 插件不适用于 Ionic

    我正在 Angular 中构建一个 Ionic 应用程序 但一直无法让插件工作 例如 我尝试使用状态栏插件 如下所述 http ionicframework com tutorials fullscreen apps http ionicf
  • Excel - 使用 FILTERXML 从字符串中提取子字符串

    Background 最近 我一直在尝试更熟悉将分隔字符串更改为 XML 以使用 Excel 进行解析的概念FILTERXML https support microsoft com en us office filterxml funct
  • 节点获取映射错误 - 无法读取未定义的属性“映射””

    当我尝试运行 地图 部分时出现错误无法读取未定义的属性 地图 The customersconst 已在上面声明 所以不确定 未定义是从哪里来的 地图需要声明吗 const AWS require aws sdk ses new AWS S
  • Google App Engine 不解析 JSF 2.0 标签

    我在 AppEngine 上运行 JSF 2 0 时遇到问题 我有以下index xhtml如果我部署它并打开页面 除了Title并且该页面的源代码与编写时完全相同 没有任何更改
  • STL 映射值构造函数

    我有一个类 X 我想将其放入 std map 类型的 STL 映射中 STL 映射需要将 X 存储在内存中的某个位置 因此我正在寻找一种有效的 运行时和内存 方法来创建 X 并将其存储在映射中 我注意到以下代码 其中 x 是 X 类型的对象
  • isinstance 如何用于 List?

    我试图了解 Python 的类型注释是如何工作的 例如List and Dict not list or dict 具体来说 我感兴趣的是如何isinstance list List 有效 这样我就可以创建自己的自定义注释 我看到List定
  • php 时间戳 UTC

    我有一个 PHP MySQL 查询 它将一些数据插入 MySQL 数据库 并且包含时间戳 目前INSERT查询用途NOW 对于时间戳列 它以以下格式保存在数据库中 2012 07 24 13 13 02 不幸的是 对我来说 服务器不在我的时
  • 如何将主页包含在 Sphinx 目录中?

    假设我有一个 Sphinx 项目 其来源如下 index rst installation rst templating index rst module rst fieldtype rst index rst 主页 具有以下目录树 toc
  • Mongoid 3 - 检查复合键的唯一性

    我切换到 Mongoid 3 这使得一些事情有所不同 目前我尝试检查复合字段是否唯一 class Host include Mongoid Document field ip type gt String field port type g
  • 如何让 CSS3 渐变跨越整个页面的高度,而不仅仅是视口?

    我有一个跨浏览器的 CSS 渐变 如下所示 background background 1E5799 old browsers background moz linear gradient top 002c5a 0 79d6f4 100 f
  • 在Python中通过引用传递引用

    python 中是否可以通过引用传递引用 在C 中 可以通过向数据传递指针来模仿Python传递数据的模型 指针按值传递 函数可以更改它指向的任何内容 但函数不能更改指针的值 但是 在 C 中 您还可以传递对指针的引用 在这种情况下 您可以