Python赋值运算符优先级 - (a,b)= a [b] = {},5

时间:2015-08-20 20:36:02

标签: python variable-assignment

我在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)

这里发生了什么?

1 个答案:

答案 0 :(得分:17)

来自Assignment statements documentation

  

赋值语句计算表达式列表(请记住,这可以是单个表达式或以逗号分隔的列表,后者产生元组)并将单个结果对象从左到右分配给每个目标列表。

你有两个任务目标列表; a, ba[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