面试的时候被问到了,记录整理一下
1. 可变量与不可变量
1.1 变量的创建
在了解可变、不可变变量的基本定义之前,我们需要明白变量是如何被创建的。
x = 1
python解释器会判断1在内存中是否存在,若不存在,python会分配内存,在内存中创建数字1,然后看变量x是否存在,若不存在就创建x,最后把1赋值给x。
y = 1
当继续输入上行代码时,1已经在内存中被创建了,现在是否需要重新创建一个1,然后赋值给y呢?还是直接将刚才就创建好的1赋值给y呢?答案是后者。我们可以通过id或者is来判断是否在内存中是同一个地址。
print(id(x) == id(y)) # True
但当我们换成一个列表来尝试呢?
a = [1,2,3]
b = [1,2,3]
print(id(a) == id(b))
答案却和上面的结果相反,也就是说内存中即使有了x的[1,2,3],python中要创建把[1,2,3]赋给y的时候并没有把x指向的那个赋过去,而是重新在内存中开辟了一块新的空间,创建了一个新的[1,2,3]!这就引出了可变和不可变变量。
1.2 变量区别
按照我的个人理解,可变变量(mutable variable)就是内存中内容可以被修改的变量,而不可变变量(immutable variable)就是内存中内容不可以被修改的变量。
2. 变量的分类
2.1 不可变变量
整型
浮点型
布尔型
复数
字符串
元组
2.2 可变变量
列表
集合
字典
其他迭代器
3. 拷贝的差别
copy和deepcopy都表示拷贝,那么二者的区别就在于可变、不可变对象。copy和deepcopy对于不可变对象来说是没有区别的,都是把指向内存已有的空间的引用进行拷贝;但对于可变对象,copy是拷贝指向内存已有空间的引用,而deepcopy才是新开辟一块空间,将原来的内容完全拷贝,然后返回新的空间的引用。
4. 参数传递的差别
参数传递的过程也是很容易出现疑惑的过程。C++中的参数传递很明确,引用就是引用,形参就是形参,但Python中不是,因为python中没有明确的指针、引用。
对不可变变量,传递进函数后由于作用域改变,函数内部有新的空间,因此会产生形参,将原来的不可变变量进行复制,然后在函数内部进行后续操作。
对可变变量,本身内容就可以被修改,那么在函数内部也允许修改本身,因此传递进函数的是该内存空间的引用,对该参数操作,相应的在主函数也会被修改。