我在Twitter上看到了这个Python片段,并且对输出非常困惑:
class iptools:
@staticmethod
def dottedQuadToNum(ip):
"convert decimal dotted quad string to long integer"
return struct.unpack('>L', socket.inet_aton(ip))[0]
@staticmethod
def numToDottedQuad(n):
"convert long int to dotted quad string"
return socket.inet_ntoa(struct.pack('>L', n))
@staticmethod
def makeNetmask(mask):
bits = 0
for i in xrange(32-int(mask), 32):
bits |= (1 << i)
return bits
@staticmethod
def ipToNetAndHost(ip, maskbits):
"returns tuple (network, host) dotted-quad addresses given"
" IP and mask size"
# (by Greg Jorgensen)
n = iptools.dottedQuadToNum(ip)
m = iptools.makeMask(maskbits)
net = n & m
host = n - mask
return iptools.numToDottedQuad(net), iptools.numToDottedQuad(host)
这里发生了什么?
答案 0 :(得分:17)
来自Assignment statements documentation:
赋值语句计算表达式列表(请记住,这可以是单个表达式或以逗号分隔的列表,后者产生元组)并将单个结果对象从左到右分配给每个目标列表。
你有两个任务目标列表; a, b
和a[b]
,值{}, 5
从左到右分配给这两个目标。
首先将{}, 5
元组解压缩到a, b
。您现在拥有a = {}
和b = 5
。请注意,{}
是可变的。
接下来,将相同的字典和整数分配给a[b]
,其中a
评估字典,b
评估为5
,因此您设置密钥{ {1}}在字典中为元组5
创建循环引用。 ({}, 5)
因此引用{...}
已引用的同一对象。
因为作业是从左到右进行的,所以你可以将其分解为:
a
所以a, b = {}, 5
a[b] = a, b
与a[b][0]
是同一个对象:
a