Julia中显式传数组与无参函数调用数组的差异探究
Julia函数参数与外部变量引用的核心差异解析
一、两种函数调用方式的核心差异
核心区别在于变量的作用域与绑定关系:
1. 显式传参场景(案例1)
let test = [1,2,3] function testf(test) display(test) test = "blah" display(test) end testf(test); display(test) end
这里函数testf的test是局部参数变量,调用时只是把外部test的数组引用绑定到这个局部参数上。当函数内执行test = "blah",只是给这个局部参数重新赋值,和外部的test变量没有任何关系——二者是同名但独立的变量,所以外部的数组不会被修改。
2. 直接引用外部变量场景(案例2)
let test = [1,2,3] function testf() display(test) test = "blah" display(test) end testf(); display(test) end
这个函数没有参数,内部的test直接引用let作用域里的外部变量。执行test = "blah"时,是直接修改这个外部变量的绑定关系,把它从数组改成字符串,所以外部的test会同步变化。
二、案例1与案例3的本质差异
案例1和案例3的表面效果一致(外部test都没被修改),但底层逻辑完全不同,存在未体现的关键差异:
案例1的底层逻辑
函数参数test和外部test指向同一个数组对象,只是绑定到不同的变量上。如果在案例1里修改数组元素:
let test = [1,2,3] function testf(test) test[1] = 100 # 修改数组元素 display(test) end testf(test); display(test) # 外部数组也会变成[100,2,3] end
外部数组会跟着变化,因为二者共享同一个数组对象。
案例3的底层逻辑
let test = [1,2,3] function testf() test_copy = copy(test) display(test===test_copy) # output: false (Julia 1.4.1) test_copy[1] = 100 # 修改副本元素 display(test_copy) end testf(); display(test) # 外部数组还是[1,2,3] end
test_copy = copy(test)创建了原数组的独立副本,test_copy是全新的数组对象,和原数组没有关联。不管修改副本的元素还是重新赋值,都不会影响原数组。
所以二者本质不同:案例1是共享对象的不同变量绑定,案例3是完全独立的两个对象。
内容的提问来源于stack exchange,提问作者Paul Eugenio
相关产品推荐
相关产品推荐

