https://www.toutiao.com/a6583429024326877700/ Python变量的对象都是对象,可以是基本整数、浮点数等类型的对象,也可以是组合类型的对象,如list等。程序中建立和使用的各种复杂对象,包括Python函数等,都是基本独立的存储块实现,通过链接相互关联。程序是里的名字(变量、参数、函数名等)关联着作为其值的对象,这种关系可以用赋值操作改变。 Python语言中变量的这种实现方式称为变量的引用语义,在变量里保存值(对象)的引用。采用这种方式,变量所需的存储空间大小一致,因为其中只需要保存一个引用。有些语言采用的不是这种方式,它们把变量的值直接保存在变量的存储区里,称为值语义。这样,一个整数类型的变量就需要保存一个整数所需的空间,一个浮点数变量就需要足够的空间存储一个浮点数。如果一个变量中需要保存很大的数据对象,它就需要占据更大的存储空间。例如C语言采用的就是变量的值语义。
Python语言的实现基于一套精心设计的链接结构。变量与其值对象的关系通过链接的方式实现,对象之间的联系同样也通过链接。一个复杂对象内部也可能包含几个子部分,相互之间通过链接建立联系。如果一个list包含10个字符串,那么在实现中,在这个list对象里就会记录这10个字符串的链接关系。 在Python的数据结构中,对象分为不可变对象和可变对象。基本数据类型如int、float、bool等都是不可变对象。在结构数据类型中,元组tuple、str是不变对象。list、dict、set是可变对象,可变对象存储的元素的引用其实是没有改变的,改变的是其引用指向的值。
在值语义的C语言中,函数有参数传递有值传递和指针传递(C++中还有引用传递)一说。而在引用语言的Python语言中,所有的传递都是引用传递,但引用的对象有不变对象与可变对象的区别,当用不变对象的变量对形参赋值时,因对象的不变性,函数内、外的不变对象变量会开辟不同作用域的内存空间,因而彼此不会受到影响,而对于可变对象变量而言,因为其可变,所以当函数引用时,并不会开辟不同的内存空间,所以可以改变可变变量的元素指向的值。 下面通过一个实例来理解一下: 运行结果: 变量引用关系: 在Python中,一切都是对象,字面常量先分配内存单元ID,当这个字面常量赋值给变量时,变量存储这个ID,实现引用语义。 在C中,变量直接存储值,实现值语义,然后通过指针实现引用语义; 在C++中,变量直接存储值,实现值语义,然后通过指针和引用实现引用语义。 C++是C的延续与加强,而Python是另一种语言设计思路。 -End- |
|
来自: 山峰云绕 > 《Python代码知识游戏黑客编程与英语》