Python学习记录 | Peanuts' Blog

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 位不变