【基础知识】python和C中变量的区别,python赋值、浅拷贝、深拷贝的区别

一、python和C中变量的区别

总结

  1. C中变量有类型代表一定内存

  2. 而Python变量只是封装过的指针(指针变量的局限性在python中却没有),没有类型。如果不指向对象,就没有意义,更谈不上类型。这也是python中一个变量名可以随便更改类型赋值的原因。

  3. python中 a=b,和C中 a=b是完全不同的两个操作。前者只是指针(引用)的赋值,而后者则完全是内存的复制

本质

1. C语言

其他语言的变量有"variables"

比如c语言中,定义一个变量,就是把值放到变量盒子(一块内存)里面去:
在这里插入图片描述
如上图所示,赋值b=a,就是新建一个盒子,然后把值赋值一份放过去,特点是:两个值之间完全独立

  • 变量类型一旦声明,在整个程序运行过程中,变量的类型不能再改变,变量所分配的空间以及变量能进行的相关操作都是固定的
    例如:int a = 12; a=12.3; 变量a定义为整型,在整个程序过程中类型不能再变,把实型赋值给它,它也只接受整数部分,发生了赋值时的自动类型转换

  • C语言中,变量必须先利用类型说明符,先声明后使用,否则会出现语法错误,同时类型一旦确定,程序中将无法再修改。

2. Python

python的则是 "names"

python的变量就是贴标签!(python里面不是什么都是对象么,我们的变量名就是一个标签而已,类属性啥的都在变量自己内部保存着呢!)
在这里插入图片描述
上面的a=2之后,1就没有归属了,就无法调用了,python的基于引用的内存管理器很快就会把这个对象的内存给清理掉的。

  • 由于变量对应的内存空间中存储的是值的地址,因此变量指向的值的类型可以任意变化,也可以理解为python中变量的类型可以随意变化
    a = 12
    a= (3,4)
    前一个瞬间,变量a代表的是整型值,简单类型;后一个瞬间,a表示的是元组,容器类型。

二、python赋值、浅拷贝、深拷贝的区别

转自:菜鸟教程

总结

  • 直接赋值:其实就是对象的引用(别名)。
  • 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。
  • 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。

示例

>>>a = {1: [1,2,3]}
>>> b = a.copy()
>>> a, b
({1: [1, 2, 3]}, {1: [1, 2, 3]})
>>> a[1].append(4)
>>> a, b
({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})

深度拷贝需要引入 copy 模块:

>>>import copy
>>> c = copy.deepcopy(a)
>>> a, c
({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})
>>> a[1].append(5)
>>> a, c
({1: [1, 2, 3, 4, 5]}, {1: [1, 2, 3, 4]})

解析

1、b = a: 赋值引用,a 和 b 都指向同一个对象。
在这里插入图片描述
2、b = a.copy(): 浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。
在这里插入图片描述
3、b = copy.deepcopy(a): 深度拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。
在这里插入图片描述

#!/usr/bin/python
# -*-coding:utf-8 -*-
 
import copy
a = [1, 2, 3, 4, ['a', 'b']] #原始对象
 
b = a                       #赋值,传对象的引用
c = copy.copy(a)            #对象拷贝,浅拷贝
d = copy.deepcopy(a)        #对象拷贝,深拷贝
 
a.append(5)                 #修改对象a
a[4].append('c')            #修改对象a中的['a', 'b']数组对象
 
print( 'a = ', a )
print( 'b = ', b )
print( 'c = ', c )
print( 'd = ', d )

以上实例执行输出结果为:

('a = ', [1, 2, 3, 4, ['a', 'b', 'c'], 5])
('b = ', [1, 2, 3, 4, ['a', 'b', 'c'], 5])
('c = ', [1, 2, 3, 4, ['a', 'b', 'c']])
('d = ', [1, 2, 3, 4, ['a', 'b']])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值