> 文章列表 > 12-python内存地址

12-python内存地址

大家好,今天我们来聊一聊Python中的内存地址和数据类型。你知道吗,Python中的数据类型可以分为两种:不可变数据类型和可变数据类型。这就像是你的房间,有的东西你不能轻易改变,比如你的名字、数值,而有的东西你可以随时调整,比如你的书桌位置。

首先,我们来看看不可变数据类型,比如数值、字符串、布尔值和元组。这些数据存储在计算机中的某个位置,不管你怎么赋值,内存地址都是固定的。就像你的名字,不管你有多少个外号,别人提到你的名字时,想到的都是你。

a = "jack"
b = "jack"
print(id(a))  # 2431929483504
print(id(b))  # 2431929483504

这里的id()函数就是用来查看变量的内存地址的。可以看到,给字符串"jack"定义了两个别名a和b,它们的内存地址是相同的。

接下来,我们说说可变数据类型,比如列表、字典和集合。这些数据类型就像你的书桌,你可以随时调整它的位置和内容,但是它们的内存地址并不会变。就像你换了个书桌,但是书桌的地址是不会变的。

a = [1, 2, 3]
b = [1, 2, 3]
print(id(a))  # 不同的地址
print(id(b))  # 不同的地址

看到没,虽然a和b的内容一样,但是它们的内存地址是不同的。

说到这里,你可能会有疑问,如果我对不可变数据类型进行修改,会发生什么呢?这里也有个比喻:就像你不能把你的名字改成其他人,但是你可以换一个称呼。不可变数据类型就是你的名字,你不能改,但是你可以用另一个名字代替它。

a = 1
print(id(a))  # 2546017632496
a = 2
print(id(a))  # 2546017632528

看到没,虽然我们没有直接修改1,但是1已经被赋予了新的内存地址。

而可变数据类型就像是你的书桌,你可以随时调整它的内容,但是它的内存地址不会变。

a = [1, 2, 3]
print(id(a))  # 2287597971776
a.append(4)
print(id(a))  # 2287597971776

嵌套也是一样,不管你怎么修改,内存地址都不会变。

a = [1, 2]
b = [3, a]
print(id(b))  # 2509191607104
a.append(4)  # 对a修改,b不受影响
print(id(b))  # 2509191607104

最后,我们来说说浅拷贝。浅拷贝就像是你的房间里的一些东西,你复制了一份,但是这些东西还是共享的。就像你的书架上的书,你复制了一份书架,但是书还是放在原来的位置。

a = [1, 2]
b = a
print(id(a))
print(id(b))

这样,a和b的内存地址是相同的。如果a的子列表发生变化,b也会跟着变。

a = [1, [2, 3]]
b = a
print(id(a[1][0]))

好了,今天的内容就到这里。希望你能更好地理解Python中的内存地址和数据类型。如果你有任何问题,欢迎在评论区留言哦!

12-python内存地址

1.查看内存地址

a=1
print(id(a)) # 2431929483504

2.数据类型
(1)不可变数据类型:数值、字符串、布尔值、元组
数据存储在计算机中的某个位置,不管赋值给谁,内存地址都相同

a="jack"
b="jack"
print(id(a))
print(id(b))
# 输出结果相同

在此例中,为字符串“jack”定义了两个别名a和b(即变量名a,b是对字符串地址的引用),便于我们表示这个字符串

a="jack"
b="jack"
print(id(a))
print(id(b))
print(id("jack"))
# 输出均相同

(2)可变数据类型:列表、字典、集合
对于可变数据类型,内存会开辟不同的内存地址存放相同的数据

a=[1,2,3]
b=[1,2,3]
print(id(a))
print(id(b))
# 输出结果不同

3.数据修改
(1)不可变数据类型
不同数据存放的地址不同,会使变量指向不同的地址

a=1
print(id(a)) # 2546017632496
a=2
print(id(a)) # 2546017632528

(2)可变数据类型
对数据的修改可视为在原地址上对数据的修改,地址不会改变

a=[1,2,3]
print(id(a)) # 2287597971776
a.append(4)
print(id(a)) # 2287597971776

嵌套同样,在下例中,a和b的地址均未发生变化

a=[1,2]
b=[3,a]
print(id(b)) # 2509191607104
a.append(4) # 对a修改,b不受影响
print(id(b)) # 2509191607104

4.浅拷贝
(1)直接赋值
拷贝的是内存地址,其中任一个的值发生变化,另一个也会跟随变化

a=[1,2]
b=a
print(id(a))
print(id(b))
# 相同
a=[1,[2,3]]
b=a
print(id(a[1][0]))
print(id(a[1]