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 '''

 

posted @ 2022-03-23 19:14  Ambitious~  阅读(366)  评论(0)    收藏  举报