变量与类型

在 python 中,类型属于对象,变量是没有类型的:

  1. a=[1,2,3]
  2. a="Runoob"

以上代码中,[1,2,3] 是 List 类型,”Runoob” 是 String 类型,而变量 a 是没有类型,她仅仅是一个对象的引用(一个指针),可以是 List 类型对象,也可以指向 String 类型对象。

变量与地址、可变类型与不可变类型

在C语言中,系统会为每个变量分配内存空间,当改变变量的值时,改变的是内存空间中的值,变量的地址是不改变的。
而在python中,Python采用的是基于值的管理方式。
当给变量赋值时,系统会为这个值分配内存空间,然后让这个变量指向这个值;当改变变量的值时,系统会为这个新的值分配另一个内存空间,然后还是让这个变量指向这个新值。
也就是说,C语言中变量变的是内存空间中的值,不变的是地址;而在Python中,变量变的是地址,不变的是内存空间中的值。
所以,如果在函数内对参数的int型、string型进行修改,相当于函数会建立一个新的临时变量。而如果对list、tuple的内部元素进行修改,函数返回之后list和tuple对象内部的元素指向的地址也会改变。

直接赋值、浅拷贝和深度拷贝

numpy的copy函数就是深度拷贝
参考:https://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html
1、b = a: 赋值引用,a 和 b 都指向同一个对象。
变量引用机制、变量拷贝 - 图1
2、b = a.copy(): 浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)
变量引用机制、变量拷贝 - 图2

  1. b = copy.deepcopy(a): 深度拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。

需要import copy导入copy模块
变量引用机制、变量拷贝 - 图3