python函数中的参数传递(值传递?引用传递?共享对象传递?又来了)
1600 2022-01-07 09:18
上次说到可以用平行世界的方式。量子力学。来理解java函数中的参数传递。很聪明的。举了一个栗子,就是流浪汉去救助站(收容所)里拿着自己的饭盆去打饭。顺利的领导了食物,却发现自己的饭盆虽然一模一样。但是已经不是自己送进窗口时的那个饭盆了。整个世界的bug被他发现了。
下面是对jvm方法区调用时的解读
原来,java虚拟机,加载类文件之后,转换成字节码,加载类,运行main函数在栈中分配局部变量的空间,存储的是一个对象实例信息的引用(基本数据类型之外),即在堆里创建一个该类的对象,所得到的引用,这时等号左边的运行。同时等号右边,运行。虚拟机中的方法区就获取了类里面的方法表,当类里的某个函数被main主函数调用,那么如果涉及到新的方法(函数)执行,就有新的栈帧,在栈里运行。
里面比较特殊的是string字面量的存储。常量池也是方法区的一部分,涉及到数值字面量和字符串字面量拼接的时候有很多节省空间的办法导致了理解上的困难。这里记得判断两个字符串是否相等妥当的方法是equals。如果用双等号==来判断,就需要你很了解底层,知道什么时候字符串内容、字面量存在方法区。字符串的哪个部分存在堆里面。返回的数值是个引用,双等号判断的是引用是否相等。并不是内容是否真的相等。
注意:方法区是一个规范,和堆一样是被所有线程共享。但是被叫做“非堆”。
回归python。
当定义函数时,形参(在函数定义中出现的参数可以看做是一个占位符),在函数被调用时,实参(函数被调用时给出的参数包含了实实在在的数据)。
函数就像新手村的任务。早早的设定好了。等着你。一个村口的老婆婆,一个家中的老爷爷。很定是丢了什么东西。或者看到后山有妖怪。
玩家是并行的进来游玩。每个人都会碰到相同的NPC,这个相同,仅仅是面貌相同。但是他们会被引导的剧情,所干的事,所做的操作都是一样的。那么服务器怎么实现呢?那就是副本。让你下载一个小程序,在本地活跃起来。彼此之间任务互不干扰。但是这个老爷爷、老婆婆的分身,都是从一个原型上来的。是不是平行宇宙了?
说回那个领饭盒的乞丐。系统收到了他的饭盆请求。懒得搭理他珍贵、珍惜的饭盆。知道他要饭。把早已经准备好的属于他的饭盒扔给他,还要骗过他,让他以为这就是现实中自己刚才松手之前的那个饭盆。这样他就不会以为他活在虚拟机中。而是活在现实当中。而实际上。信息足够逼真。是可以蒙骗大多数玩家的。三叶,你是在梦里吗?
迷坑:
这个坑在于语言的进化。首先不受限制的C语言,从根本上有无穷的功能。里面对各种功能也没有限制。就出现了基本类型之外,还有指针类型、构造类型、空类型(传参或返回值可以忽略的意思)。其中指针类型可以互相赋值。这在java中是被明令禁止的(没有这个功能,你也没法做出法外之事。你可以想象,但是实现不了)。而在C语言中,指针变量可以被赋值,值的内容就是取地址符加上变量名,获得改变量对应分配的内存位置。
对于枚举类型,是为了把功能限制在自己设计过的路径里面。避免意外。
对于结构体,java用自定义类来实现。对于共用体,java用static(static的作用 是将成员变量或方法存储进方法区)来实现。
对于数组,java用容器来实现。
对于python,可更改(mutable)与不可更改(immutable)对象。在 python 中,类型属于对象,变量是没有类型的。在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。可变类型如 列表,字典。
全部评论