Python内存相关

Python内存相关

示例一:python

v1 = [1, 2, 3]
v2 = [1, 2 ,3]

v1 = 123
v2 = 123

v1 = "dogfa"
v2 = "dogfa"
# 虽然v1 和v2 的值相同,可是因为v1和v2 在内存中分别开辟了两块不一样的空间,因此理论上v1的内存地址不等于v2的内存地址   (在Python中有不一样变化,下面会介绍)

示例二:缓存

v1 = [1, 2, 3]
v1 = [4, 5, 6]
# v1最开始指向的内存地址是[1, 2, 3],可是因为对v1进行了从新赋值,因此v1从新指向了内存地址中的[4, 5, 6],这个时候原来v1 指向的内存地址中的[1, 2, 3]因为没有变量接收,将会被Python中的GC(垃圾回收机制)释放掉。

示例三:app

v1 = [1, 2, 3]
v2 = v1
v2.append(4)
print(v1)       # [1, 2, 3, 4]
print(v2)       # [1, 2, 3, 4]
# v1 的内存地址指向了[1, 2, 3],v2 = v1 表示将v1 的内存地址赋值给了v2, 也就意味着v2的内存地址也指向着[1, 2, 3],不管对v1 中的元素仍是对v2 中的元素进行改变,都将互相影响。

v1 = [1, 2, 3]
v2 = v1
v1 = 123
print(v1)       # 123
print(v2)       # [1, 2, 3]
# 首先v1 和v2 指向了同一个内存地址,可是后来对v1 进行了从新赋值,v1所指向的内存地址发生了改变,而v2所指向的内存地址并无发生改变,仍是原先v1 所指向的内存地址,因此print(v1)将输出 “123”, print(v2)将输出[1, 2, 3]

v1 = "dogfa"
v2 = v1
v1 = "oldniu"
print(v1)       # oldniu
print(v2)       # dogfa

示例四:code

v = [1, 2, 3]
lst = [11, 22, v]
v.append(4)
print(v)        # [1, 2, 3, 4]
print(lst)      # [11, 22, [1, 2, 3, 4]]
# lst 中的v 实际上存放的是指向的内存地址

v = [1, 2, 3]
lst = [11, 22, v]
lst[2].append(4)
print(v)        # [1, 2, 3, 4]
print(lst)      # [11, 22, [1, 2, 3, 4]]

v = [1, 2, 3]
lst = [11, 22, v]
v = 4
print(v)        # 4
print(lst)      # [11, 22, [1, 2, 3]]
# v 的内存地址发生了改变,而lst中的v指向并无发生改变

v = [1, 2, 3]
lst = [11, 22, v]
lst[2] = 33
print(v)        # [1, 2, 3]
print(lst)      # [11, 22, 33]

结论:当变量属于不可变类型时(str,int,tuple),对其从新赋值,将会开辟新的内存空间。当变量属于可变类型时(list,dict,set),对其内部的元素进行操做时,将不会从新开辟内存空间,对整个变量进行赋值时,将会开辟新的内存空间。对象

小数据池

v1 = 123
v2 = 123
print("int:", id(v1))
print(id(v2))

v1 = "dogfa"
v2 = "dogfa"
print("str:", id(v1))
print(id(v2))

理论上v1和v2的内存地址是不同的,可是结果是否真的如此吗?如下是打印输出结果。blog

从打印结果咱们 能够看出内存地址是彻底一致的,那么是否意味着咱们以前所认为的全都是错误的?其实并非的。内存

由于在Python当中有一个小数据池,你能够理解为是一个容器,里面存放了int类型和str类型的数据的存储规则。class

一、int类型的规则:它会把 -5 ~ 256 范围内的数进行缓存,当你将这些整数赋值给变量时,它不会再次开辟新的内存空间,而是使用已经建立好的缓存对象。容器

二、str类型的规则:① 出现特殊字符时,内存地址不相等变量

​ ② 当字符超过20个以上时,内存地址不会相等

is 和 == 的区别

  1. is:对内存地址进行比较

    v1 = 123
    v2 = v1
    print(v1 is v2)      # True
    v1 = 321
    print(v1 is v2)      # False
  2. ==:对两边的值进行比较

    v1 = 6
    v2 = 6
    print(v1 == v2)  # True
相关文章
相关标签/搜索