swift - 斯威夫特:当一个引用类型常量被分配给一个变量,但该变量发生了变化时会发生什么?
问题描述
我对 var 和 let 快速引用类型之间的区别感到困惑。
在下面的代码中,让 head 分配给 var current:
public class ListNode {
public var val: Int
public var next: ListNode?
public init() { self.val = 0; self.next = nil; }
public init(_ val: Int) { self.val = val; self.next = nil; }
public init(_ val: Int, _ next: ListNode?) { self.val = val; self.next = next; }
}
var current = ListNode()
let head = current
current.next = ListNode(3)
current = current.next!
print(current.val) -> return "3"
print(head.val) -> return "0"
print(head.next?.val) -> return "3"
我不明白为什么 head.val = 0 和 head.next.val = 3 最后。
我知道 head 和 current 是类的一个实例,因此它们是引用类型。它们应该指向完全相同的内存地址。但这让我很困惑为什么
当前=当前。下一个!
不会使 head 也等于 current.next。
head 和 current 不是指向同一个内存地址吗?为什么它们可以是不同的值?如果有人告诉我, head 不能改变值,因为它是一个常数,那么为什么 head.next?.val 改为 3?
答案一定很明显,因为我没有看到有人问这个问题。但我只是迷路了。谢谢!
解决方案
您希望引用类型变量像指针一样工作,但事实并非如此。引用类型确保如果您更改特定实例的属性,该更改也将反映到对同一实例的所有其他引用。
但是,当您更改可变引用指向的实例时,不会更改的实例不会传播到指向原始实例的其他引用。其他引用仍将指向原始实例。
推荐阅读
- python - 如何优化 pandas 应用功能
- linux - Linux:强制从命令行触发 PCIe MSI 中断
- postgresql - 通过 pg_dumpall 将 db 从 pgsql 9.5 迁移到 12.4 不包括所有表
- extjs - ExtJS - 无法找到支持的框架
- android - 按钮没有按预期做出反应,我正在尝试查看该功能是否不起作用或是否存在其他错误
- python - 调节硒有问题
- java - 多模块 Maven 和 Spring Boot 项目不会为辅助模块生成胖可执行 jar
- flutter - 如何在颤动的 VideoPlayer 上捕获服务器端错误?
- python - 如何遍历目录列表以检查它们在删除尝试后是否仍然存在?
- terraform - Terraform 状态文件被锁定并卡住无法完成