Julia中函数无法修改标量却可修改数组的原因探究
Julia中基础类型与数组修改行为差异的原因
首先要明确:Julia手册里说“所有值都是真正的对象”是准确的,差异的核心不是对象与非对象的区分,而是类型的可变性(Mutability)。
不可变类型(Immutable Types)
像Float64、Bool这类基础类型都属于不可变类型——它们的实例一旦创建,内部数据就无法被修改。当你把这类值传给函数时,函数里的变量只是绑定到原对象的一个副本(或者说新的变量绑定),你在函数里对变量的赋值操作,本质是让这个变量重新绑定到一个新的不可变对象,完全不会影响原对象。
举个例子:
function modify_num(x) x = x + 1.0 println("函数内:", x) end num = 3.0 modify_num(num) println("函数外:", num)
运行后会发现,函数外的num还是3.0,因为函数里的x只是新创建了一个4.0的对象,和原对象无关。
可变类型(Mutable Types)
数组(Array)属于可变类型——这类对象的内部数据可以被修改。当你把数组传给函数时,函数里的变量和外部变量绑定的是同一个对象,所以对数组元素的修改,本质是直接修改了这个共享对象的内部内容,外部自然能看到变化。
举个例子:
function modify_arr(arr) arr[1] = 99 println("函数内:", arr) end arr = [1, 2, 3] modify_arr(arr) println("函数外:", arr)
运行后数组的第一个元素会变成99,因为函数直接修改了原数组对象的内容。
Julia如何区分这两类类型
Julia通过类型定义的方式区分:
- 用
struct定义的是不可变类型,基础数值类型、自定义的不可变结构体都属于这类; - 用
mutable struct定义的是可变类型,数组、自定义的可变结构体属于这类。
不可变类型的实例无法修改其字段,而可变类型的实例可以自由修改字段内容(数组的元素就是其内部字段的一部分)。
内容的提问来源于stack exchange,提问作者Curious student
相关产品推荐
相关产品推荐

