我有一个非常烦人的问题,我花了几天时间试图解决。 我在网上找不到任何信息。
我尝试自己解决这个问题,查阅了文档。 但没有任何效果。
我的问题是
当我用
X
函数分配变量 RandMAC()
时,X
每次使用时都应该是相同的。
就像,
X = RandMAC()
,假设 X
现在是 AA:BB:CC:DD:EE:FF
当我打印 X 3 次时,它应该是这样的。
X = AA:BB:CC:DD:EE:FF
X = AA:BB:CC:DD:EE:FF
X = AA:BB:CC:DD:EE:FF
但是代码实际做的是
X = AA:BB:CC:DD:EE:FF
X = 00:0A:0B:0C:0D:0E:0F
X = 11:22:33:44:55:66
所以每次我调用 print X 时它都会改变。
我该如何解决这个问题?
我的代码如下。
from scapy.all import *
X = RandMAC()
print X
print X
print X
提前谢谢大家。
RandMAC
是一个类,当你调用RandMAC()
时,你得到的是该类的一个实例。 scapy
有很多这样的 RandXXXXX
类,它们的行为方式都相同:类的实例实际上是一种随机事物生成器,而不是固定的(而是随机选择的)事物。在本例中,一个 RandMac
由六个 RandByte
构建而成,并且每次询问其值时,RandByte
都会变成 0 到 255 之间的随机值。
我认为,这个想法是为了让构建(例如)一个 IP 数据包随机化器变得容易,它为您提供完全相同的 IP 数据包,除了为每个数据包随机选择几个字段之外。
因此,无论如何,对随机事物对象的许多操作都有效地委托给“修复”它们的结果(即选择一个特定的随机值);参见源代码中的
volatile.py
,类VolatileValue
;神奇的事情发生在 __getattr__
方法中。特别是,这适用于通过 __str__
进行字符串化,这就是 Lycha 观察到的 str()
所做的事情以及 Karun S 观察到的 print
所做的事情。
如果您想获得单个随机值,最接近正确方法的方法可能是调用
_fix
方法:X = RandMAC()._fix()
。这恰好与 str
的 RandMAC
相同,但是例如如果你有一个随机整数,那么 _fix
会给你一个实际的整数,而 str
会给你它的字符串表示形式。
这些似乎都没有记录在案。不要对它在未来版本中仍然有效进行任何大赌注。 (但是,就其价值而言,
volatile.py
大约两年没有改变。)
我不知道
RandMac
是否有其他方法可以做到这一点,但是您可以将 X
转换为字符串,这样它将保持不变。在你的代码中X
实际上每次都会调用一个函数。
X = str(RandMAC())
print X
print X
print X
为什么不直接使用循环来打印它:
x=str(RandMAC())
for i in range(3):
print(x)