理解python词典中的括号

时间:2016-02-29 05:53:14

标签: python dictionary

我是Python 2.7的新手,并且一直在学习从图书馆借用可能过于先进的python书籍,但他们就是他们所拥有的。我试图通过O' Reilly分解来自 Think Compexity 的代码,关于字典词典如下:

class Graph(dict):
    """A Graph is a dictionary of dictionaries.  The outer
    dictionary maps from a vertex to an inner dictionary.
    The inner dictionary maps from other vertices to edges.

    For vertices a and b, graph[a][b] maps
    to the edge that connects a->b, if it exists."""

    def __init__(self, vs=[], es=[]):
        """Creates a new graph.  
        vs: list of vertices;
        es: list of edges.
        """
        for v in vs:
            self.add_vertex(v)

        for e in es:
            self.add_edge(e)

    def add_vertex(self, v):
        """Add a vertex to the graph."""
        self[v] = {}

    def add_edge(self, e):
        """Adds and edge to the graph by adding an entry in both directions.

        If there is already an edge connecting these Vertices, the
        new edge replaces it.
        """
        v, w = e
        self[v][w] = e
        self[w][v] = e

我无法理解括号内的代码,例如def __init__(self, vs=[], es=[])。我得到它分配属性," vs"和" es"列表,但为什么这些在函数内声明?为什么"自我"那里? def add_vertex(self, v)def add_edge(self, e)相同。

是否可以使用以下内容在函数内声明列表?

vs = {}

3 个答案:

答案 0 :(得分:0)

vses是初始化Graph类的实例时使用的参数。如果在__init__中定义它们,则在初始化实例时它们将始终相同。 []是用户未传递参数时的默认值。例子:

d1 = Graph(vs=[1,2])               #Creates a graph with 2 vertices, no edges
d2 = Graph(vs=[1,2,3], es=[(1,3)]) #Creates a graph with 3 vertices,  1 edge

如果您在初始化时无法指定vses,则必须执行以下操作:

d1 = Graph()          #Creates blank graph
d1.add_vertex(1)      #Adds vertex 1
d1.add_vertex(2)      #Adds vertex 2
d1 == Graph(vs=[1,2]) #Returns True

d2 = Graph()
d2.add_vertex(1)      #Adds vertex 1
d2.add_vertex(2)      #Adds vertex 2
d2.add_vertex(3)      #Adds vertex 3
d2.add_edge((1,3))    #Adds edge between vertex 1 and 3
d2 == Graph(vs=[1,2,3], es=[(1,3)])  #Returns True

答案 1 :(得分:0)

self包含在这个函数声明中,其他因为Python没有像大多数其他对象语言那样隐式传递self,而是像Perl一样明确地传递它:

def __init__(self, vs=[], es=[]):

vses只是函数的形式参数,可以这样想:

def __init__(self, vs, es):

=[]部分是默认值,只是空列表,以便在未提供可选参数的情况下防止代码中断。

答案 2 :(得分:0)

if(horizontalBoundary && verticalBoundary){ if(pattern == 1){ diagonalDown(getWidth()-100,365); }else if(pattern == 2){ diagonalDown(getWidth(),150); } else { // added this else block ballX = 30; ballY = 30; pattern = 1; } } vs=[]是带有默认值的参数声明。如果在es=[]的调用中忽略其中任何一个,它将默认为空列表。 __init__是实例本身。你看,self不是构造函数,而是初始化函数;在调用 __init__之前构造实例。

(名称__init__是常规名称;可能是self或任何内容。所有实例方法都会将实例作为第一个参数接收。)

参数thisvs分别是顶点列表和构造时提供的边缘列表(即es)。对代码进行粗略检查可以认为边是一个元组Graph(...),其中(v1, v2)v1是顶点。 v2是一个字典,其键是来自顶点;每个顶点映射到其键为顶点的字典。与Graph相关联的值的存在意味着存在边self[a][b];代码暗示a->b

否则 self[a][b] == self[b][a] == (a,b)会创建一个本地名称 vs={}引用一个空字典(vs会使vs=[]引用一个空列表)。形式参数也是本地名称,但它是在呼叫时初始化的本地名称