为什么用python获取mac地址会变动?

Python013

为什么用python获取mac地址会变动?,第1张

首先声明,我本人还没有研究出来问题的究竟。此处只是写下我本人的一点小心得,大家一起进步。

因为我发现,使用uuid库得到的mac地址,总有最后一位不对。所以,我就查看了python官方的uuid文档,找到了问题的关键是调用UUID()的时候,会调用getnode()函数以得到物理地址。

这个是getnode()函数的定义:

我把它摘出来,考到下面。

def getnode(*, getters=None):

"""Get the hardware address as a 48-bit positive integer.

The first time this runs, it may launch a separate program, which could

be quite slow.  If all attempts to obtain the hardware address fail, we

choose a random 48-bit number with its eighth bit set to 1 as recommended

in RFC 4122.

"""

global _node

if _node is not None:

return _node

if sys.platform == 'win32':

getters = _NODE_GETTERS_WIN32

else:

getters = _NODE_GETTERS_UNIX

for getter in getters + [_random_getnode]:

try:

_node = getter()

except:

continue

if (_node is not None) and (0 <= _node <(1 <<48)):

return _node

assert False, '_random_getnode() returned invalid value: {}'.format(_node)

我正在试图通过研究这个问题来试图研究。但同样,我觉得我们可以直接让python调用系统库,从而执行系统自带的命令:(类似于windows下cmd里面"ipconfig -all"命令,或者ubuntu下terminal中"ifconfig"命令)。实现物理地址。之后,根据“短时间内该机器的网卡不会出现过大的变动这个前提”,我们可以根据返回内容,切片出我们需要的部分即可。

== (双=), a == b —— 检测两个变量的字面值是否相同

id(a)/id(b) —— 读取单个变量对象的内存存储地址

is(操作符) a is b—— 检测两个变量存储的对象的内存存储地址是否相同

举例:

1、整形数值的字面值为于0-255之间

①值相同: X=1,Y=1时—— 用 X == Y 检测这些整形数值的字面值是相同的,都是1,用 id(X) 、 id(y)(调用X或 调用Y),检测也都是指向同一地址11,这个值只占用一个内存地址,并且值相同的情况下,不管有多少个变量来调用这个值,都会指向这个同一值和这个值得内存地址,地址设为11,此时X=Y=1,共同读取内存地址11。

②值不同 :变化为X=1,Y=2 时 ——值不同(1、2)所以变量会分别指向不同值和不同内存地址,此时:X=1仍旧读取地址11,Y=2读取地址22。

③值相同:变化拓展为X=2,Y=2,Y=Z时——则X=Y=Z=2 读取地址为22。

以上三种情况,X、Y、Z都是变量,1和2是值,11和22是内存地址。①和③里不同变量指向同一值并且内存地址也相同的机制称为:内存地址的共享引用。但是这种不同变量引用相同值得到相同内存地址的情况仅限于整形数值的字面值在0-255之间,和部分短字节中。这是因为0-255之间的值的地址已被Python预缓存在内存中,而当整形数值的字面值大于255时,即便不同变量引用相同字面值,但内存的分配的地址也绝对不可能相同。举例如下

2、整形数值的字面值大于255

④值相同:X=500,Y=500时—— 用 X == Y 检测他们的字面值是相同的500 但是用id(X)、 id(y)或 X is Y检测他们的内存地址时,虽然字面值相同,但字面值500大于255,所以X与Y不共享内存地址,此时X内存地址为55,Y地址为66

⑤值不同 :变化为X=500,Y=600 时 —— 字面值不同且500、600都大于255,所以变量会分别指向不同内存地址,此时:X值=500已在④中声明过,所以X地址仍为55,Y因改变值则重新新建地址为77。

⑥值相同:再变化为x=600,y=600,y=z时——则x=y=z=600

用x == y ==z 检测他们字面值相同都是600 ,但因字面值600大于255,所以x与y与z不共享内存地址。用id(x)、 id(y)、 id(z)检测他们的内存地址也都不相同。此时:Y值=600已在⑤中声明过,所以此地址不变Y地址仍为77,X因改变值则重新建地址为88、z新建内存地址99。(并且由于Python的垃圾回收机制,每一个释放过的对象地址都可以被再次进行使用。所以⑥里X的地址也可以是之前④里Y已释放的的地址66,⑥里Z也可以使用X之前的内存地址55或Y之前使用的66)变量不存储值,而是绑定到值。当一个对象没有被绑定到任何一个变量时,它会在合适的时候被销毁,所占用的内存空间也会被回收。所以当一个新的对象被创建时,完全有可能分配到曾经回收的内存。简单可理解为对象地址是:先声明先占有,释放则回收。