Python-day5-可变与不可变类型及深浅拷贝

可变与不可变类型

**可变类型:**值改变,ID不变,证明改的是原值,证明原值是可以修改的;

**不可改变类型:**值改变,ID也变,证明产生的是新值,证明原值是不可被修改的;

**整形、浮点型、字符串、布尔:**在Python中都被设计成了不可分割的整体,只能全部被替换,不能被修改,即不可变类型;

**列表、字典:**整个列表或key:value为一个整体,修改其中的某个值是可以被修改的,即可变类型;

整形

不可变类型

**PS:**重新赋值后,ID号发生改变,证明新值是申请的一块新的内存空间,原值被解绑,即所有的赋值是产生新值;

>>> x = 10
>>> print(id(x))
140619687270992
>>> x = 11
>>> print(id(x))
140619687271024

浮点型

不可变类型

>>> x = 3.1
>>> print(id(x))
140619687994096
>>> x = 3.2
>>> print(id(x))
140619692270544

字符串

不可变类型

>>> print(id(x))
140619691585328
>>> x = "def"
>>> print(id(x))
140619692564976

布尔

不可变类型

显式布尔值:True/False

隐式布尔值:所有数据类型,其中0、None、空为假

>>> x = 1
>>> y = 2

>>> print(x>y)
False
>>> print(id(x>y))
4314790496

>>> print(x<y)
True
>>> print(id(x<y))
4314790528

列表

可变类型

>>> l = ['a','b','c']
>>> print(id(l))
140619692558336

# 取第0位值(a),修改为A,再次打印ID
>>> l[0] = 'A'
>>> print(id(l))
140619692558336

字典

可变类型

>>> dic = {'k1':1,'k2':2,'k3':3}
>>> print(dic)
{'k1': 1, 'k2': 2, 'k3': 3}
>>> print(id(dic))
140619691617088

# 修改k1的值为8,再次打印ID
>>> dic['k1'] = 8
>>> print(dic)
{'k1': 8, 'k2': 2, 'k3': 3}
>>> print(id(dic))
140619691617088

字典补充

格式:key:value

用花括号{}分隔开多个key:value,其中:key必须是不可变类型,value可以是任意类型(整形、浮点型、列表、字典本身)

PS:通常key是字符串,是为了更有识别性,0.001极少数才会将key定义为其他类型~

# 正常
dic = {
'k1':111,
'k2':3.1,
'k3':[1,2,3],
'k4':{'name':'Peng', 'age':18}
}

>>> print(dic)
{'k1': 111, 'k2': 3.1, 'k3': [1, 2, 3], 'k4': {'name': 'Peng', 'age': 18}}

>>> print(dic['k1'])
111
>>> print(dic['k2'])
3.1
>>> print(dic['k3'])
[1, 2, 3]
>>> print(dic['k4'])
{'name': 'Peng', 'age': 18}

----------------------------------------

# 不正常(没有辨识性)
dic = {
'1':111,
'1.1':222
}

>>> print(dic['1'])
111
>>> print(dic['1.1'])
222

深浅拷贝

从下面三个方面的例子中,相互理解期间的区别

Linux的软硬连接

总结(软硬连接与原文件的对话):

软连接:它死(删除)了我也就不灵了,但别人打(修改)它我照样疼

硬链接:它死不死(删除)跟我没关系,我们俩谁挨揍(修改)都相互疼~

# 软连接
基于某个文件/目录/命令的本身,复制创建一个软连接,打开软连接的区别于打开文件/目录/命令本身效果一样;
    # 创建方式:
      ln -s file1.txt file1
      ln -s /tmp tmp1
      ln -s /usr/bin/sh sh

  	# 区别:
        # 修改
          修改软连接,原文件会同步
          修改原文件,软连接会同步
        # 删除
          删除软连接,不会影响原文件
          删除原文件,软连接找不到指向的文件,打开失败
    
# 硬链接
基于某个文件/目录/命令的本身,复制创建单独的一份,打开软连接的区别于打开文件/目录/命令本身效果一样;
    # 创建方式:
      ln file1.txt file1
      ln /tmp tmp1
      ln /usr/bin/sh sh

  	# 区别:
        # 修改
          修改硬连接,原文件会同步
          修改原文件,硬连接会同步
        # 删除
          删除硬连接,不会影响原文件
          删除原文件,不会影响硬链接

MySQL的主从复制

总结(MasterSlave的相互对话):

Master:我有的它有,我没有的它还有~

Slave:它有的我有,它没有的我还有~

# Master && Slave
		# 区别
    		修改Master数据,Slave会同步
    		修改Slave数据,Master不改变,但Slave本身还会继续同步

Python中的深浅拷贝

总结(深浅拷贝与源数据的对话):

浅拷贝:只有它第一次的数据,无论修改谁含有的第一次数据,我们都会同步,除第一次的数据外,都互不影响~

深拷贝:双胞胎,一模一样的数据,但以后各活各的

浅拷贝

浅拷贝只会拷贝一次数据,双方修改数据只会影响第一次拷贝时相互拥有的数据,后面的数据双方不会影响

# 用list_1和list_2来做测试
		# list_1:源数据
  	# list_2:浅拷贝
    
# 1.定义list_1的列表,浅拷贝一份给list_2,此时数据相同
>>> import copy
>>> list_1 = [1,2,[3,4]]
>>> list_2 = copy.copy(list_1)
>>> list_1
[1, 2, [3, 4]]
>>> list_2
[1, 2, [3, 4]]

# 2.追加list_1数据,list_1本身发生改变,list_2不会变
>>> list_1.append(3)
>>> list_1
[1, 2, [3, 4], 3]
>>> list_2
[1, 2, [3, 4]]
>>> list_1,list_2

# 3.追加list_2数据,list_2本身发生改变,list_2不会变
>>> list_2.append(4)
>>> list_1
[1, 2, [3, 4], 3]
>>> list_2
[1, 2, [3, 4], 4]

# PS:此时发现,append新值操作对双方并无影响
# 4.修改list_1中浅拷贝含有的数据(第2位)数据,此时双方都发生变化
>>> list_1[2].append(5)
>>> list_1
[1, 2, [3, 4, 5], 3]
>>> list_2
[1, 2, [3, 4, 5], 4]

# 5.修改list_2中浅拷贝含有的数据(第2位)数据,此时双方都发生变化
>>> list_2[2].append(6)
>>> list_1
[1, 2, [3, 4, 5, 6], 3]
>>> list_2
[1, 2, [3, 4, 5, 6], 4]

# PS:此时发现,append浅拷贝含有的数据,则双方互相更新,是因为指向的都是源数据的内存地址

深拷贝

深拷贝是完全拷贝,重新申请内存地址进行保存变量及数据,数据变化只影响自己本身,不影响深拷贝数据,相互完全独立

# 1.定义list_1的列表,浅拷贝一份给list_2,此时数据相同
>>> import copy
>>> list_1 = [1,2,[3,4]]
>>> list_2 = copy.deepcopy(list_1)
>>> list_1
[1, 2, [3, 4]]
>>> list_2
[1, 2, [3, 4]]

# 2.追加list_1数据,list_1本身发生改变,list_2不会变
>>> list_1.append(3)
>>> list_1
[1, 2, [3, 4], 3]
>>> list_2
[1, 2, [3, 4]]

# 3.追加list_2数据,list_2本身发生改变,list_2不会变
>>> list_2.append(4)
>>> list_1
[1, 2, [3, 4], 3]
>>> list_2
[1, 2, [3, 4], 4]

# PS:此时发现,append新值操作对双方并无影响
# 4.修改list_1中浅拷贝含有的数据(第2位)数据,此时双方不发生变化
>>> list_1[2].append(4)
>>> list_1
[1, 2, [3, 4, 4], 3]
>>> list_2
[1, 2, [3, 4], 4]

# 5.修改list_2中浅拷贝含有的数据(第2位)数据,此时双方不发生变化
>>> list_2[2].append(5)
>>> list_1
[1, 2, [3, 4, 4], 3]
>>> list_2
[1, 2, [3, 4, 5], 4]

# PS:此时发现,双方的数据互不影响,完全独立,都有自己单独申请的内存空间
posted @ 2022-06-09 18:26  秋风お亦冷  阅读(33)  评论(0)    收藏  举报