Python赋值和复制

Python的一些特性

赋值- 赋值(绑定)操作 -别名

Python - 变量进行赋值的时候,用的是一个等于符号(=)
  Python的类型是动态绑定的
Python 是对象(数据)之间的交互
01.使用别名 -一个地方的修改会给其他地方带来意想不到的变化
 比较:C 语言是变量(也即内存地址)之间的交互,

复制操作方式

02.使用复制-复制对象
  copy.copy-- shallow copy
              复制对象和包含的内嵌对象的引用,但不复制内嵌的对象
  copy.deepcopy 深度复制 --是完全分开的对象
              复制对象
              复制对象引用的对象
    类似于:当前文件夹的文件
            文件夹下所有的文件
查看方式
01.深拷贝和浅拷贝
  画状态图
  对象和其属性的状态图称为对象图 object diagram
02.阅读程序方法:
   跟踪程序执行流程-遇到调用的函数,先假定函数正确工作,即不去检查函数内部实现,关注输入和输出
 03. guardian 守卫
     scaffold 脚手架

变量和对象的关联关系

refrence
 <别名:aliased>
 当一个对象有多个引用,并且引用有不同的名称时,我们说这个对象是有别名的
 如果有别名的对象是可变的,则对一个别名的修改会影响另外一个  (10.11 别名)

数据类型

Python中的对象分为两种类型,可变对象和不可变对象,
不可变对象指 tuple、str、int等类型的对象,
  可变对象指 list dict  自定义对象等类型的对象
不可变数据类型:
   字符串是不可变的
可变数据类型
    操作方式:
      01. 修改列表操作   append 修改列表
         t2 = t1.append(3),t2的值返回是 None
      02.新建列表操作: + 操作创建一个新的列表,原始列表不改变
函数头和函数体 --形参 和实参
   在函数体中创建的变量时local,只存于这个函数中
   无返回值函数,如果将该值赋给某个变量,则会得到值 None 类型是 NoneType
   有返回值函数       
在函数中给全局变量重新赋值,需要在使用前声明这个全局变量,在函数中 global 语句告诉编译器,指的是全局变量

类和对象

类 -对象 --实例
新建一个对象的过程--instantiation 实例化-对象的这个类称为一个实例
对象是可变的--对象的属性
1.Python的类
 01.动态添加属性
  创建了一个class的实例后,我们可以给该实例绑定任何属性和方法
 02.限制实例属性
  定义一个特殊的__slots__变量,来限制该class实例能添加的属性
  slots只能限制添加属性,不能限制通过添加方法来添加属性
   __slots__要注意,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的
2.Python的 --内存管理机制 --垃圾回收机制
 python采用的是引用计数机制为主,标记-清除和分代收集两种机制为辅的策略。
 三种情况会触发垃圾回收:gc模块的自动垃圾回收机制
        调用gc.collect(),需要先导入gc模块。
        当gc模块的计数器达到阀值的时候。
        程序退出的时候

附录:

C/C++ - 值传递和引用传递都是C++中的概念
 值传递(passl-by-value)过程中, 《传递的是值的副本。方法中对副本的修改,不会影响到调用方》
    被调函数的形式参数作为被调函数的局部变量处理,
即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。
值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,
不会影响主调函数的实参变量的值。
 引用传递(pass-by-reference)
    被调函数的形式参数虽然也作为局部变量在堆栈中开辟了内存空间,
但是这时存放的是由主调函数放进来的实参变量的地址。
被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。
正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量
Python - 参数传递的是变量所指向的对象的地址就行,
   传对象(call by object)
    可变对象和不可变对象
    操作类型
Java/Scala
 基本类型(byte,short,int,long,double,float,char,boolean)为传值
 对象类型(Object,数组,容器)为 传引用 --传的是内存的地址的值
   主要查看--对象的内存区域--
 特殊类型
     String、Integer、Double等immutable类型因为类的变量设为final属性,无法被修改,只能重新赋值或生成对象。
  当Integer作为方法参数传递时,对其赋值会导致原有的引用被指向了方法内的栈地址,失去原有的的地址指向,所以对赋值后的Integer做任何操作都不会影响原有值

参考:

Python 直接赋值、浅拷贝和深度拷贝解析 https://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html
谈谈 python 中的赋值(绑定)操作  http://www.codebelief.com/article/2017/01/talking-about-the-assignment-operation-in-python/
C语言中函数参数传递的三种方式 https://blog.csdn.net/weibo1230123/article/details/75541862

blogroll

social