Python学习记录
人生苦短,我用Python
浅拷贝、较深拷贝、深拷贝以及切片复制
浅拷贝即指“重命名”。变量赋值如a=b
,但实际a,b内存指向同一块地址。
较深拷贝即使用copy()
函数进行拷贝,开辟新的内存空间。若存在可变元素,则可变元素仍指向同一块地址。
深拷贝即使用deepcopy()
函数进行拷贝,开辟新的内存空间。
切片复制并非引用原有的内存,而是进行拷贝,实质是较深拷贝。(与Go语言的引用不同)
切片
- 对
list[:]
赋值时,是替换list
中的元素 - 读取
list[:]
时,是进行浅拷贝
Python中是实参按照对象传递的
形参和实参指向同一对象,但在函数内新建的对象将不在全局范围内被修改 详情参考Python: 函数参数是值传递还是引用传递?
Python负数的存储
Python,Java 等语言中的数字都是以补码
形式存储的。但 Python 没有 int , long 等不同长度变量,即在编程时无变量位数的概念。
获取负数的补码: 需要将数字与十六进制数 0xffffffff
相与。可理解为舍去此数字 32 位以上的数字(将 32 位以上都变为 00 ),从无限长度变为一个 32 位整数。
返回前数字还原: 若补码 aa 为负数( 0x7fffffff
是最大的正数的补码 ),需执行 ~(a ^ x) 操作,将补码还原至 Python 的存储格式。 a ^ x
运算将 1 至 32位按位取反; ~
运算是将整个数字取反;因此, ~(a ^ x)
是将 32 位以上的位取反,1 至 32 位不变