第一章 1.17 内存管理, 拷贝,正则表达式

一. 内存管理

1. C语言中内存管理的概念

  • 内存分为堆区间和栈区间
  • C的栈区间的内存是系统自动申请和释放(自动管理)
  • C的堆区间的内存需要调用malloc函数申请,调用free函数释放

其他高级语言中的垃圾管理机制是针对堆区间的内存进行管理的

2. python的内存管理机制

1) 内存的申请

python中所有的数据都是存在堆中的,变量是保存在栈区间的,变量中保存的是保存在堆中的数据的地址。
重新给变量赋值,会先在内存开辟新的内存保存新的数据,然后将新的数据的地址重新保存到变量
但是如果使用数字或者字符串给变量赋值,不会直接开辟新的内存,而是先检查内存有没有这个数据,如果有直接将原来的数据的地址给变量

2)内存的释放(垃圾回收机制)

在python中一个数据对应的内存空间是否释放,就看这个数据的引用计数是否为0;如果引用计数为0,数据对应的内存就会被自动释放
循环引用问题: python的垃圾回收机制会自动处理循环引用问题

增加引用计数: 增加数据的引用(让更多的变量来保存数据的地址)
减少引用计数: 删除引用,或者让引用去保存新的数据

3)查看引用次数

导入sys模块中的getrefcount
print(getrefcount(list2))
getrefcount函数在调用时会给形参赋值,所以打印的值会比我们需要的值多1

3.循环引用

  • 堆中的数据相互间的引用,数据计数不为零,不被释放
  • python的垃圾回收机制会自动解决循环引用的问题



二. 拷贝(需要导入copy模块)

1. 直接赋值

一个变量给另外一个变量赋值时,两个变量的数据是同一个值

2.浅拷贝

拷贝之后产生新的相同的数据,新的地址.但是若数据内有引用其他的数据,则其他数据的地址还是原来的地址,(相当于一个人的类,有一个狗的属性,浅拷贝之后,多个人对象拥有同一条狗(拷贝之后狗对象的地址不变,只是多了几次引用))

3.深拷贝

(多个人都拥有各自的狗)

from copy import copy, deepcopy


class Dog:
    def __init__(self, name, color='黄色'):
        self.name = name
        self.color = color

    def __repr__(self):
        return '<%s __id: %s>' % (str(self.__dict__)[1:-1], id(self))


class Person:
    def __init__(self, name, age=10, gender='男', dog=None):
        self.name = name
        self.age = age
        self.gender = gender
        self.dog = dog

    def __repr__(self):
        return '<%s __id: %s>' % (str(self.__dict__)[1:-1], id(self))


# 直接赋值
print('直接赋值')
p1 = Person('小明', dog=Dog('大黄'))
p2 = p1    # 赋值后p1和p2指向是同一个Person对象
print('p1:', p1)
print('p2:', p2)
p1.gender = '女'
p1.dog.color = '白色'
print('p1:', p1)
print('p2:', p2)

print('=============浅拷贝==============')
p1 = Person('小明', dog=Dog('大黄'))
p2 = copy(p1)
print(p1)
print(p2)
p1.gender = '女'
p1.dog.color = '白色'
print('p1:', p1)
print('p2:', p2)

print('=============深拷贝===========')
p1 = Person('小花', dog=Dog('大黄'))
p2 = deepcopy(p1)
print('p1:', p1)
print('p2:', p2)
p1.gender = '女'
p1.dog.color = '白色'
print('p1:', p1)
print('p2:', p2)

魔法方法(__repr__):自定义打印结果的显示
def repr(self):
return '<%s __id: %s>' % (str(self.dict)[1:-1], id(self))



三. 正则表达式

1.正则表达式

用正则符号来描述字符串规则让字符串匹配更简单(计算机语言基本支持正则,python通过re模块支持正则)

2. 正则符号

(一) 匹配符号

1).普通字符:在正则中没有特殊功能和意义的字符
2).特殊字符:
①:点(.) - 代表任意字符

print(re.fullmatch(r'a..b', 'au9b'))

②:(\w) - ASCII码表中只能匹配字母、数字或者下划线;ASCII码表以外的都可以匹配

print(re.fullmatch(r'a\wb', 'a8b'))

③:(\d) - 匹配任意一个数字字符

print(re.fullmatch(r'a\d\db', 'a33b'))

④:(\s) - 匹配任意一个空白字符(空格,缩进,换行...)

print(re.fullmatch(r'a\sb', 'a\tb'))
print(re.fullmatch(r'a\sb', 'a\nb'))

⑤:(\W \D \S) -> 功能和小写的相反
\W - 匹配ASCII码表任意非字母数字下划线
\D - 匹配任意非数字字符
\S - 匹配任意非空白字符

print(re.fullmatch(r'a\Db\Sc\Wd', 'aZb=c+d'))

⑥:[字符集] - 匹配字符集中的任意一个字符(一个中括号只能匹配一个字符集)
注意:前一个字符的编码值一定要比后一个字符的编码值要大
当字符集中有减号时,减号不能放中间

  •  [1-9] - 匹配123456789中的任意一个字符
  •  [0-9] - \d
  •  [a-z] - 匹配任意一个小写字母
  •  [A-Z] - 匹配任意一个大写字母
  •  [a-zA-Z] - 匹配任意一个字母
  •  [\u4e00-\u9fa5] - 匹配任意一个中文字符
  •  [1-9abc] - 匹配1~9或者abc中的任意一个字符
  •  [a-zA-Z0-9_] - 匹配字母数字下划线
  •  [\dxyz] - 任意数字或者x、y、z
print(re.fullmatch(r'a[xyz89?]b', 'azb'))
print(re.fullmatch(r'a[xyz]b', 'anb'))
print(re.fullmatch(r'a[23456789]b', r'a7b'))
print(re.fullmatch(r'a[1-9abc]b', 'aab'))
print(re.fullmatch(r'a[abc1-9]b', 'aab'))
print(re.fullmatch(r'a[ac1-9b]b', 'aab'))
print(re.fullmatch(r'a[+*-]b', 'a-b'))
print(re.fullmatch(r'a[\dxyz]b', 'axb'))
print(re.fullmatch(r'a[\\dxyz]b', 'a\\b'))

⑦:[^字符集] - 匹配除了字符集以外的其他任意字符
注意:符号^只能放在最前面!

print(re.fullmatch(r'a[xyz^]b', 'a^b'))
(二) 检测符号

①: \b - 检测是否是单词结尾
单词结尾-所有可以区分出两个不同单词的符号都是单词结尾,其中字符串开头和字符串结尾
用法:检测\b所在的位置是否是单词结尾;不影响匹配的时候的字符串长度

re_str = r'a\db\b'
print(re.fullmatch(re_str, 'a7b'))

②:^ - 检测是否是字符开头

re_str = r'^\d\d\d'
print(re.fullmatch(re_str, '123'))
print(re.search(re_str, 'k898ahs237khhj'))

③:$ - 检测是否是字符结尾

re_str = r'\d\d\d$'
print(re.search(re_str, '123k898ahs237khhj990'))
(三) 匹配次数

①:? - 匹配0次或1次
例: x? - x出现0次或1次
\d? - 数字出现0次或1次
②:* - 任意次数,0次也可以
③:+ - 1次或多次

print(re.fullmatch(r'ax?b', 'axb'))
print(re.fullmatch(r'a\d*b', 'a12b'))
print(re.fullmatch(r'a\d+b', 'a1272937928329b'))

④:{}
a: {N} - 匹配N次
b: {M,N} - 匹配M到N次
b: {M,} - 至少匹配M次
b: {,N} - 最多匹配N次

re_str = r'a\d{3,5}b'
print(re.fullmatch(re_str, 'a78988b'))
print(re.fullmatch(re_str, 'a7898b'))
print(re.fullmatch(re_str, 'a789880b'))   # None

练习

# 练习: 写一个正则表达式判断输入的内容是否是整数
# 123 -> 成功!  123a -> 失败!   -123  -> 成功!   --123 -> 失败!   +123 -> 成功
re_str = r'[+-]?[1-9]\d*'

贪婪和非贪婪

匹配次数不确定的时候有贪婪和非贪婪状态
? * + {M,} {M,N} {,N} 默认贪婪
在能匹配成功的前提下,尽可能多的匹配
?? *? +? {M,}? {M,N}? {,N}? 非贪婪
在能匹配成功的前提下,尽可能少的匹配

3. 分支和分组

1).分支

正则1 | 正则2 - 先让正则1匹配,再让正则2匹配;只要有一个匹配就能成功

# 匹配一个字符串: abc前是3个数字或者3个字母
# 123abc, uJhabc
re_str = r'\d{3}abc|[a-zA-Z]{3}abc'
2).分组

①:整体控制次数: ()匹配次数
②:将正则表达式作为一个整体操作

重复:带分组的正则表达式\M - 在\M的位置重前面第M个分组匹配到的内容

re_str = r'(\d{3}|[a-z]{3})abc'
print(re.fullmatch(re_str, 'mskabc'))
re_str = r'(\d+)([a-z]+)=\2'
print(re.fullmatch(re_str, '6kh=kh'))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354