指向链表的指针什么时候会改变实际的链表?

2023-11-21

我有一个单链表 L,并创建一个指向该列表 P 的指针。似乎有时修改 P 会更改实际列表,而其他时候修改 P 对实际列表 L 没有任何作用,只会更改 P 所指向的内容到。

假设我创建一个指向 L 的指针,P = L(在 python 中)。执行类似 P = P.next 的操作会使 L 保持不变,但 P.next = P.next.next 会更改 L。同样,通过修改 P.data 来更改存储在列表中的实际数据实际上会更改 L.data。

为什么会出现这种情况?我觉得我错过了一些关于指针/引用的基本知识。

class Node:
    def __init__(self, val):
        self.val = val
        self.next = None

    def addNode(self, val):
        root = self
        while root.next is not None:
            root = root.next
        root.next = Node(val)

    def iterateLL(self):
        root = self
        print
        while root is not None:
            print(str(root.val) + " ", end="")
            root = root.next
        print()

if __name__ =="__main__":
    L = Node(1)
    L.addNode(2)
    L.addNode(3)
    L.addNode(4)

    # iterate through list and print:
    L.iterateLL()

    # changing value of pointer does not affect L
    P = L
    P = P.next
    L.iterateLL() # L is unchanged

    # changing "next" value of pointer does affect L
    P = L 
    P.next = P.next.next
    L.iterateLL() # now we've skipped node 2

    # changing data of pointer does affect L
    P = L
    P.val = 10
    L.iterateLL()

上面的代码执行后输出如下(第一行显示原始链表,第二行显示指针 P 更改后链表未更改,而第三行和第四行显示链表已更改)

1 2 3 4

1 2 3 4

1 3 4

10 3 4

这里发生了什么?为什么改变 P 不会影响 L,但改变 P.next 和 P.val 会影响?如果所有这些操作的行为方式相同,也不会改变指针always更改链表(因此 P = P.next 应该通过删除第一个节点来修改 L),或者never更改链表(因此 P.next = P.next.next 应该保持 L 不变)?

我有一种感觉,这与 L.next 是一个指针有关,就像 P.next 一样。因此修改 P.next 最终会修改 L.next 指向的内容(?)。但我觉得规则对我来说不太清楚。


In most在 Python 中,当你对变量执行赋值时,P在这种情况下,值P改变了,但它最初引用的对象没有改变。这是因为 Python 变量只是对象的引用/指针。这是一个例子:

var1 = "test1"
var2 = "test2"
var3 = var1 # var3 = "test1"
var1 = var2 # var1 = "test2"

print(var1) # "test2"
print(var2) # "test2"
print(var3) # "test1"

那么这里发生了什么?我们只是改变这些变量指向的内容,而不是改变底层对象。

现在,在您的情况下,您执行以下操作:

# changing value of pointer does not affect L
P = L
P = P.next
L.iterateLL() # L is unchanged

当你这样做时P = L and P = P.next,你只需改变变量的内容P正在指向。您没有对底层对象进行更改P指着。让我们想象一下。

Original Configuration: Original Configuration

P = L

P = L

P = L.next

P = L.next

然而,当你这样做时

P = L
P.next = P.next.next
L.iterateLL() # we've now skipped node two

您正在更改对象的属性P正在指向。您正在设置属性P.next指向P.next.next。您实际上并没有对底层对象进行更改P.next原本是指的。通过这样做,该对象P.next最初指向超出范围并被垃圾收集器清理。

P.next = P.next.next

P.next = P.next.next

根据您的代码判断,我认为您在这种情况下的预期行为是删除L从 LinkedList 中得到一个像“2 3 4”这样的列表。为了实现这一点,应该足以做到L = L.next。这将导致第一个节点超出范围,垃圾收集器应该清理它。

作为一个快速警告,我在most在某些情况下,赋值不会更改变量所指向的对象。然而,属性有点不同。他们重写了__set__魔术方法,它允许您使用赋值运算符编辑底层对象。这里的情况并非如此。

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

指向链表的指针什么时候会改变实际的链表? 的相关文章

  • Django REST序列化器:创建对象而不保存

    我已经开始使用 Django REST 框架 我想做的是使用一些 JSON 发布请求 从中创建一个 Django 模型对象 然后使用该对象而不保存它 我的 Django 模型称为 SearchRequest 我所拥有的是 api view
  • 如何在刻度标签和轴之间添加空间

    我已成功增加刻度标签的字体 但现在它们距离轴太近了 我想在刻度标签和轴之间添加一点呼吸空间 如果您不想全局更改间距 通过编辑 rcParams 并且想要更简洁的方法 请尝试以下操作 ax tick params axis both whic
  • 如何使用固定的 pandas 数据框进行动态 matplotlib 绘图?

    我有一个名为的数据框benchmark returns and strategy returns 两者具有相同的时间跨度 我想找到一种方法以漂亮的动画风格绘制数据点 以便它显示逐渐加载的所有点 我知道有一个matplotlib animat
  • Flask 和 uWSGI - 无法加载应用程序 0 (mountpoint='')(找不到可调用或导入错误)

    当我尝试使用 uWSGI 启动 Flask 时 出现以下错误 我是这样开始的 gt cd gt root localhost uwsgi socket 127 0 0 1 6000 file path to folder run py ca
  • Python 多处理示例不起作用

    我正在尝试学习如何使用multiprocessing但我无法让它发挥作用 这是代码文档 http docs python org 2 library multiprocessing html from multiprocessing imp
  • pandas 替换多个值

    以下是示例数据框 gt gt gt df pd DataFrame a 1 1 1 2 2 b 11 22 33 44 55 gt gt gt df a b 0 1 11 1 1 22 2 1 33 3 2 44 4 3 55 现在我想根据
  • 如何等到 Excel 计算公式后再继续 win32com

    我有一个 win32com Python 脚本 它将多个 Excel 文件合并到电子表格中并将其另存为 PDF 现在的工作原理是输出几乎都是 NAME 因为文件是在计算 Excel 文件内容之前输出的 这可能需要一分钟 如何强制工作簿计算值
  • 从 scikit-learn 导入 make_blobs [重复]

    这个问题在这里已经有答案了 我收到下一个警告 D Programming Python ML venv lib site packages sklearn utils deprecation py 77 DeprecationWarning
  • 从列表中的数据框列中搜索部分字符串匹配 - Pandas - Python

    我有一个清单 things A1 B2 C3 我有一个 pandas 数据框 其中有一列包含用分号分隔的值 某些行将包含与上面列表中的一项的匹配 它不会是完美的匹配 因为它在其中包含字符串的其他部分 该列 例如 该列中的一行可能有 哇 这里
  • 在 NumPy 中获取 ndarray 的索引和值

    我有一个 ndarrayA任意维数N 我想创建一个数组B元组 数组或列表 其中第一个N每个元组中的元素是索引 最后一个元素是该索引的值A 例如 A array 1 2 3 4 5 6 Then B 0 0 1 0 1 2 0 2 3 1 0
  • 循环中断打破tqdm

    下面的简单代码使用tqdm https github com tqdm tqdm在循环迭代时显示进度条 import tqdm for f in tqdm tqdm range 100000000 if f gt 100000000 4 b
  • Python - 按月对日期进行分组

    这是一个简单的问题 起初我认为很简单而忽略了它 一个小时过去了 我不太确定 所以 我有一个Python列表datetime对象 我想用图表来表示它们 x 值是年份和月份 y 值是此列表中本月发生的日期对象的数量 也许一个例子可以更好地证明这
  • 如何改变Python中特定打印字母的颜色?

    我正在尝试做一个简短的测验 并且想将错误答案显示为红色 欢迎来到我的测验 您想开始吗 是的 祝你好运 法国的首都是哪里 法国 随机答案不正确的答案 我正在尝试将其显示为红色 我的代码是 print Welcome to my Quiz be
  • 如何在 Django 中使用并发进程记录到单个文件而不使用独占锁

    给定一个在多个服务器上同时执行的 Django 应用程序 该应用程序如何记录到单个共享日志文件 在网络共享中 而不保持该文件以独占模式永久打开 当您想要利用日志流时 这种情况适用于 Windows Azure 网站上托管的 Django 应
  • 用于运行可执行文件的python多线程进程

    我正在尝试将一个在 Windows 上运行可执行文件并管理文本输出文件的 python 脚本升级到使用多线程进程的版本 以便我可以利用多个核心 我有四个独立版本的可执行文件 每个线程都知道要访问它们 这部分工作正常 我遇到问题的地方是当它们
  • 循环标记时出现“ValueError:无法识别的标记样式 -d”

    我正在尝试编码pyplot允许不同标记样式的绘图 这些图是循环生成的 标记是从列表中选取的 为了演示目的 我还提供了一个颜色列表 版本是Python 2 7 9 IPython 3 0 0 matplotlib 1 4 3 这是一个简单的代
  • 使用基于正则表达式的部分匹配来选择 Pandas 数据帧的子数据帧

    我有一个 Pandas 数据框 它有两列 一列 进程参数 列 包含字符串 另一列 值 列 包含相应的浮点值 我需要过滤出部分匹配列 过程参数 中的一组键的子数据帧 并提取与这些键匹配的数据帧的两列 df pd DataFrame Proce
  • 在 Python 类中动态定义实例字段

    我是 Python 新手 主要从事 Java 编程 我目前正在思考Python中的类是如何实例化的 我明白那个 init 就像Java中的构造函数 然而 有时 python 类没有 init 方法 在这种情况下我假设有一个默认构造函数 就像
  • 改变字典的哈希函数

    按照此question https stackoverflow com questions 37100390 towards understanding dictionaries 我们知道两个不同的字典 dict 1 and dict 2例
  • Python 分析:“‘select.poll’对象的‘poll’方法”是什么?

    我已经使用 python 分析了我的 python 代码cProfile模块并得到以下结果 ncalls tottime percall cumtime percall filename lineno function 13937860 9

随机推荐

  • cgi.FieldStorage如何存储文件?

    所以我一直在尝试原始 WSGI cgi FieldStorage 和文件上传 我只是不明白它如何处理文件上传 起初 它似乎只是将整个文件存储在内存中 我想嗯 这应该很容易测试 大文件应该会堵塞内存 但事实并非如此 不过 当我请求文件时 它是
  • 如何配置 WebStorm 为 KoaJS 提供代码补全?

    目前 WebStorm 报告 KoaJS 的方法未定义 这是一个轻微但持续的烦恼 我在网上搜索过 也搜索过WebStorm的配置对话框 但没有结果 有人将 WebStorm 与 KoaJS 一起使用并且智能感知 代码完成正常工作吗 这是一个
  • 我们如何使用 TriggerDagRunOperator 触发多个气流 dag?

    我有一个场景 其中特定的 dag 完成后需要触发多个 dag 已使用 TriggerDagRunOperator 触发单个 dag 是否可以将多个 dag 传递给 TriggerDagRunOperator 来触发多个 dags 是否可以仅
  • C++ 可变参数模板 AND 和 OR

    可以使用C 11可变参数模板来完成吗 in template
  • 修改jar文件

    我有一个 jar 文件 在 html 文件中用作小程序 我想修改 jar 文件的内容并重建 jar 文件 以便 html 可以与新的 jar 文件一起正常工作 我怎样才能做到这一点 我已经尝试使用 7zip 解压缩 并修改了源代码并创建了新
  • 如何在postgis中创建一个以米为单位的圆?

    我想问一下如何创建一个圆radius 4km 我已经尝试过ST Buffer功能 但它创造了一个更大的圆圈 我通过将其多边形插入新的 kml 文件来查看创建的圆 这就是我正在尝试的 INSERT INTO camera geom circl
  • 为什么我要删除 build/ 目录?

    Flutter Dart Android 新手 在控制台中刚刚做了 C Users lordnull gt flutter help clean Delete the build directory 只是想知道为什么我们要删除项目的构建目录
  • “传递结果失败” - onActivityForResult

    我有一个LoginActivity 用户登录 基本上都是自己的Activity它的主题就像一个对话框 看起来像一个对话框 它出现在一个SherlockFragmentActivity 我想要的是 如果有成功登录 应该有两个FragmentT
  • 将多个 .yml 文件传递​​给 docker-compose

    这里是 Docker 菜鸟 我的 docker 文件夹中有两个文件 docker compose build yml 和 docker compose up yml 以下是两个文件的内容 docker compose build yml v
  • 龙卷风.gen.engine 与tornado.gen.coroutine 的区别

    走过龙卷风 gen文档有人可以帮助我理解tornado gen coroutine和tornado gen engine之间的确切区别 作为龙卷风文档gen engine says 该装饰器类似于协程 但它不返回 Future 和回调参数没
  • 随机路径生成算法

    我想生成一个从矩阵顶部到底部的随机路径 FIDDLE 要求 路径可以蜿蜒 但必须从第一行连接到最后一行 最终 我希望每个路径片段的颜色是随机的 但现在它可以是统一的 我在下面仅使用红色进行了测试 从上到下连接的路径是随机生成的 路径片段显然
  • 使用 Jackson 映射时将默认值设置为空字段

    我正在尝试使用 Jackson 将一些 JSON 对象映射到 Java 对象 JSON 对象中的一些字段是强制性的 我可以用 NotNull 有些是可选的 与 Jackson 映射后 JSON 对象中未设置的所有字段在 Java 中都将为空
  • Visual Studio 2008 的 XML 架构设计器

    VS 2005确实包含 XSD 文件的设计器 在哪里可以找到 VS 2008 的版本 我只找到了预览版VS 2008 测试版 2 我建议不要使用 XML 模式的数据集编辑器 微软从 VS 2005 开始停止支持模式设计器是有原因的 我们对
  • 如何使用 PowerMock 和 Mockito 模拟枚举类的实例?

    我尝试遵循这个非常相似的问题的答案中提供的示例 但它对我不起作用 我收到以下错误消息 java lang IllegalArgumentException Cannot subclass final class class com mypr
  • python - setup.py sdist bdist_wheel

    我决定创建一个名为 NsmPY 的小模块 一旦我完成了模块背后的代码 可在 GitHub 上找到 我就开始尝试将这个新模块上传到 PyPi 但是 当我运行必要的命令时python3 setup py sdist bdist wheel 程序
  • 无效更新:节中的行数无效

    我正在使用一个项目Microsoft Azure services 在删除行时我收到此错误 Terminating app due to uncaught exception NSInternalInconsistencyException
  • 如何触发MathJax?

    包括我MathJax与脚本 这会自动用格式化标签替换所有数学代码 我怎样才能触发MathJax仅通过 JavaScript 单击 而不是在加载时单击 我怎么知道MathJax将格式化的元素放在页面末尾而不是替换原始代码 1 如何仅通过 ja
  • 为什么 。 PHP $_GET 数组中的 (点) 和空格更改为 _ (下划线)? [关闭]

    Closed 这个问题是无关 目前不接受答案 In PHP 文档我发现以下部分 变量名中的点和空格将转换为下划线 例如
  • 谁是 GWLP_USERDATA 单元的所有者?

    众所周知GWLP USERDATA可用于将一些指针大小数据与指定窗口相关联 但谁有权利这样做呢 显然 如果两段代码独立执行此操作 其中一段代码会覆盖另一段代码 那么必须只有一个所有者 但必须明确确定一个一般规则 谁是所有者GWLP USER
  • 指向链表的指针什么时候会改变实际的链表?

    我有一个单链表 L 并创建一个指向该列表 P 的指针 似乎有时修改 P 会更改实际列表 而其他时候修改 P 对实际列表 L 没有任何作用 只会更改 P 所指向的内容到 假设我创建一个指向 L 的指针 P L 在 python 中 执行类似