吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1149|回复: 9
收起左侧

[讨论] python 变量没有自己独有的内存地址吗?

[复制链接]
jinzhu160 发表于 2022-5-8 09:14
本帖最后由 jinzhu160 于 2022-5-8 09:34 编辑

c# java等编程语言中, 变量有自己独有的内存地址,不会改变。
比如 在 c# 中,
int a =1;
这时候,可以用 &a 获取变量 a 的内存地址,比如变量 a 的内存地址为 0x112233,变量 a 的值为 1;
a =2;
这时候,可以用 &a 获取变量 a 的内存地址,发现变量 a 的内存地址依然为 0x112233,只是此刻 a 的值为 2;

而 python 中,变量没有自己独有的内存地址么?
比如在 python中
a =1;  
这时候,使用 print(id(a)) 输出的是 数字 1 的内存地址,根据值类型 保存值的,变量 a的内存地址也是一样的 假设为 0x223344
a =2后, print(id(a))   输出的就是数字 2 在内存中的地址了,也就是变量 a 的内存地址,发现已经变了 ,变成了 0x334455啦

变量本身的内存地址在 其他高级语言中,是不会变的。变的只是变量的值。
而 python 中, 为什么变量的地址会随便变呢;变量都是在栈内存中,如果变量的地址随时改变,那岂不是不停的新开辟内存存储变量,不是浪费性能吗?
还有 变量 a 的地址都变了,那改变以后,原来的变量 a的那块内存空间岂不是浪费了?

假设 对于列表 a  =[1,2,3,4]
还有 这个  print(id(a)) 输出的到底是对象的内存地址,还是 变量a 的内存地址呢?
在 其他高级语言中,变量 a 有自己的内存地址,变量a 的值是 对象的内存地址等等。
在 python 中,变量 a 到底有没有自己的内存地址呢?


假设 对于列表 a  =[1,2,3,4] 还有 这个  print(id(a)) 输出的到底是对象的内存地址,还是 变量a 的内存地址呢?在 python 中,变量 a 到底有没有自己的内存地址呢?
在 c#中,变量 a 是栈内存中的,有自己独立的内存地址,如 a=[123],那么变量 a的值为数组的内存地址,变量a的地址为变量a自己的内存地址。变量a的内存地址和数组[123]的内存地址是不一样的。

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

奈陌 发表于 2022-5-8 11:17
对于Python中的复杂数据类型(如:列表、元组、字典等),如果仅仅是对其中的⼀个或多个元素进⾏修改,并不会改变其地址
Harold123 发表于 2022-5-8 11:42
楼上说的有点问题,可变类型对象有列表和字典,
元组、数字、字符串属于不可变类型对象。
举个例子,列表 list_1 = [1, 2, 3] 如果你用 list_1.append(4) 你会发现前后的 id(list_1)是没有发生变化的。但是如果你使用 list_1 = [1, 2, 3, 4],这时的 id 就发生了变化。
而对于你说的占用资源,python的垃圾回收机制会自动回收无法再被引用的值。比如你定义 a = 1 , 然后又重新定义 a = 2 , 此时 1 的值所在的内存就会被自动回收。
 楼主| jinzhu160 发表于 2022-5-8 11:44
Harold123 发表于 2022-5-8 11:42
楼上说的有点问题,可变类型对象有列表和字典,
元组、数字、字符串属于不可变类型对象。
举个例子,列表 ...

好的,好像明白了,python 中一切数据类型都是对象,比如 int a =1 ,这个 1 也是对象,其他语言这都是值类型,看来 python 中全部都是引用类型。
JuncoJet 发表于 2022-5-8 12:17
Python的hash代表的就是地址,所有的数据都是建立在hash表上的,通过索引hash值得到具体数据的地址
很有意思的一个例子 a=1 b=2-1
ab的hash是相同的
Harold123 发表于 2022-5-8 12:25
jinzhu160 发表于 2022-5-8 11:44
好的,好像明白了,python 中一切数据类型都是对象,比如 int a =1 ,这个 1 也是对象,其他语言这都是值 ...

对的,python里面一切皆对象,数字、列表、字典、函数这些都是对象,变量就相当于对这些对象的引用,python变量实现方式就是引用语义,而其他语言使用值语义来实现。
C语言中定义很多个int类型变量的值都为1的话,就要同时占用很多的1的内存,但是python里面定义很多个变量值为1的话,相当于很多个变量都指向了同一个内存,当存储1的对象引用计数器变为0的时候,不会再被引用,就会自动清理掉了
 楼主| jinzhu160 发表于 2022-5-8 12:48
Harold123 发表于 2022-5-8 12:25
对的,python里面一切皆对象,数字、列表、字典、函数这些都是对象,变量就相当于对这些对象的引用,pyth ...

谢谢,明白了
wuai_leeda 发表于 2022-5-8 17:54
Python是面向对象语言,万物皆对象
XiaoZouYu 发表于 2022-5-8 18:33
python中的赋值就是一个面向对象,每打印一次地址都会变化  只有-5到256之间整数的地址是固定
三滑稽甲苯 发表于 2022-5-8 19:14
Python有小整数池的,你试试看114514这个数,结果应该就不一样了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-14 04:16

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表