Python中变量、赋值、浅拷贝、深拷贝

变量的类型是分值引用与地址引用两种.
python的一切变量都是对象,变量的存储,采用了地址引用的方式,存储的只是一个变量的值所在的内存地址,而不是这个变量的只本身。

在Python中可分为基本数据类型和复杂数据结构:
基本数据类型:bool、int、long、float、string;

复杂数据结构:对于能存储基本数据类型的变量可以把它看做复杂数据结构。如 list、dict、tuple、set;
一、变量的初始化(赋值):
1.Python中变量的初始化就是在内存中新开辟一块存储变量的值的内存,把这块内存的地址赋值给变量。(变量中存的是值的地址)
1 x = ‘a’
2 id(x)= 140574479884424
3 y=x
4 id(y) = 140574479884424
在给已经初始化的变量重新初始化的时候,就会重新更改变量中的地址。
x=2
id(x)=140574479883365
2.而在复杂数据结构中,更改数据结构中的元素(基本数据类型),仅仅是改变了这个元素的地址,而不会影响复杂数据结构本身的地址。

1 l_1 =[1,2,3]
2 id(l_1)= 4320183368
3 l_1.append(9)
4 l_1[2] = 22
5 l_1.pop(2
6 l_1,id(l_1)=> [1, 2, 22, 5, 6, 9] 4320183368
通过上边的事例做出结论:

当复杂数据结构(list、dict、tuple、set)赋值时,是在计算机中开辟一块内存来存储这个复杂数据结构的值,而修改其中元素的时候只是更改了复杂数据结构的元素的地址,不会影响复杂数据结构的地址(就像一个桌子上有坐着两个人,而桌子上的菜两个人是共同享有);当重新赋值时,会重新开辟新的内存来存储变量的值,把这块内存的地址存到变量中。(相当于桌子上的一个人移到了另一个桌子上吃)

二、拷贝:

在Python中,我们有时候要保存一份数据,再去对这块数据进行处理,而这个时候Python提供了两种拷贝方式:浅拷贝、深拷贝。

1.浅拷贝

浅拷贝: 不管是多么复杂的数据结构,浅拷贝只会拷贝第一层.
1 list_1 = [1,2,[‘a’,‘b’,‘c’],3]
2 list_2 = list_1[:] # list_2 = copy.copy(list_1)浅拷贝的另一种方式
3 list_1[2][1] = ‘kk’
4 print(list_1,list_2,id(list_1[2]),id(list_2[2])) => [1, 2, [‘a’, ‘kk’, ‘c’], 3] [1, 2, [‘a’, ‘kk’, ‘c’], 3] 4330513736 4330513736
由于浅拷贝只会拷贝list_1的第一层,所以元素中的list的地址没有被更改,说明list_1和list_2共享同一个第二层的list。
在这里插入图片描述
2.深拷贝:

深拷贝会完全复制原变量的所有数据,在内存中生成一套完全一样的内容,我们对这两个变量中的一个进行任意修改都不会影响另一个变量。
1 import copy
2 list_1 = [1,2,[‘a’,‘b’,‘c’],3]
3 list_2 = copy.deepcopy(list_1)
4 list_1[2][1] = ‘kk’
5 print(list_1,list_2,list_1[2],list_2[2]) =>[1, 2, [‘a’, ‘kk’, ‘c’], 3] [1, 2, [‘a’, ‘b’, ‘c’], 3] 4330513736 4330512584

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值