WELCOME

不积跬步,无以至千里;不积小流,无以成江海。

Python可变与不可变类型

1. 什么是不可变类型

  所谓可变类型和不可变类型是指:数据能够直接进行修改,如果能直接修改那么就是可变的,否则就是不可变的

  变量对应的值中的数据是不能被修改,如果修改就会生成一个新的值从而分配新的内存空间。

  不可变类型(修改数据,内存地址必发生改变):

    •   数字(int,long,float)
    •   布尔(bool)
    •   字符串(string)
    •   元组(tuple)
1 n = 4 2 print(id(n)) 3 n += 1 # 修改n讲话生成新的值重新赋值给变量n 4 print(id(n)) 5 6 # >> 140725846909424 7 # 140725846909456

  结果:

  两个不同的数字

 

1 b = True 2 print(id(b)) 3 b = not b 4 print(id(b)) 5 6 # >> 140725840030032 7 # 140725840030064

  结果:

  两个不同的数字

 

1 str = 'abc' 2 print(id(str)) 3 str += 'a' 4 print(id(str)) 5 print(str) 6 7 # >> 1990459568944 8 # 1990466471024 9 # abca

 

2. 什么是可变类型

  变量对应的值中的数据可以被修改,但内存地址保持不变。

  不可变类型(修改数据,内存地址不会发生变化):

    • 列表(list)
    • 字典(dict)
1 names = ['刘备', '关羽', '张飞'] 2 print(id(names)) 3 names.append('曹操') 4 print(id(names)) 5 print(names) 6 # >> 1886830744456 7 # 1886830744456 8 # ['刘备', '关羽', '张飞', '曹操']

地址没有变化

1 student = {'name': '孙尚香', 'zge': 29} 2 print(id(student)) 3 student['age'] = 20 4 print(id(student)) 5 print(student) 6 7 # >> 2972485176600 8 # 2972485176600 9 # {'name': '孙尚香', 'zge': 29, 'age': 20}

 

3. 为什么生成以上两种情况

  因为python中的值是通过引用(地址值)传递的,不可变类型的值一旦被修改后会创建一个内存空间并且生成新的地址值,可变类型的值会在原内存空间中被修改。


4. 不可变类型执行过程和内存分析

 

 

5. 可变类型执行过程和内存分析

 6.函数引用

  当函数在引用时,必须要分清楚传递的值是可变类型还是不可变类型,

如果是可变类型,里面发生改变,外层就能看到改变后的内容;

如果是不可变,里面发改变,不会邮箱外层得到的变量值。

1 def name(n1): # n1是一个数值 2 global n2 3 n2 = 100 4 for i in range(n1): 5 print('----->', i) 6 n1 += 1 7 8 9 n = 9 10 name(n) 11 12 print(n) 13 print(n2) 14 ''' 15 -----> 0 16 -----> 1 17 -----> 2 18 -----> 3 19 -----> 4 20 -----> 5 21 -----> 6 22 -----> 7 23 -----> 8 24 9 25 100 26 ''' 27 28 list1 = [1, 2, 3] 29 30 31 def te(l): 32 if isinstance(l, list): 33 for i in l: 34 print('*****>', i) 35 l.insert(0, 8) 36 else: 37 print('不是列表') 38 39 40 te(list1) 41 print(list1) 42 ''' 43 *****> 1 44 *****> 2 45 *****> 3 46 [8, 1, 2, 3] 47 '''

 


__EOF__

本文作者Ambitious
本文链接https://www.cnblogs.com/ambitiousPlus/p/16046267.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Ambitious~  阅读(356)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示