代码之家  ›  专栏  ›  技术社区  ›  jayko03

python三元if语句不捕捉None

  •  7
  • jayko03  · 技术社区  · 7 年前

    例如

    first: 7 -> 1 -> 6      617
    second: 5 -> 9 -> 2    +295
                           -----
                            912
    output: 2 -> 1 -> 9 ( which indicates 912 )
    

    这是我的密码,

    class Node:
        def __init__(self, val=None):
            self.data = val
            self.Next = None
    
    class LinkedList:
        def __init__(self):
            self.head = None
            self.size = 0
    
        def __repr__(self):
            temp = self.head
            alist = []
            while temp:
                alist.append(temp.data)
                temp = temp.Next
            return str(alist)
    
        def add(self, val):
            cur = self.head
            prev = None
            if cur is None:
                self.head = Node(val)
            else:
                while cur:
                    prev = cur
                    cur = cur.Next
                prev.Next = Node(val)
            self.size += 1
    
    def adding(p1,p2):
        pointer1 = p1.head
        pointer2 = p2.head
        remainder = 0
        sum_list = LinkedList()
    
        while pointer1 is not None or pointer2 is not None:
            first = 0 if pointer1.data is None else pointer1.data
            second = 0 if pointer2.data is None else pointer2.data
            sum_ = first + second + remainder
    
            remainder = 1 if sum_ >= 10 else 0
    
            sum_ %= 10
    
            sum_list.add(sum_)
    
            if pointer1 is not None:
                pointer1 = pointer1.Next
            if pointer2 is not None:
                pointer2 = pointer2.Next
        if remainder > 0:
            sum_list.add(remainder)
        return sum_list
    

    我的问题是 first = 0 if pointer1.data is None else pointer1.data 当两个链表的大小相同时,它会起作用,但是,如果其中一个链表比其他链表短,则较短的链表会变短 None .所以我希望if语句捕捉到这一点,并将变量(第一个)作为 0 .但它抛出 AttributeError: NoneType object has no attribute 'data' .

    如果我写得正常,它会工作,而不是 ternary operator

    if pointer1 is None:
        first = 0
    else:
        first = pointer1.data
    if pointer2 is None:
        second = 0
    else:
        second = pointer2.data
    

    三元运算符 ? 谢谢

    2 回复  |  直到 7 年前
        1
  •  8
  •   John Szakmeister    7 年前

    是的,实际上您并没有像if/else语句那样使用三元运算符。

    这:

    if pointer1 is None:
        first = 0
    else:
        first = pointer1.data
    if pointer2 is None:
        second = 0
    else:
        second = pointer2.data
    

    如下所示:

    first = 0 if pointer1 is None else pointer1.data
    second = 0 if pointer2 is None else pointer2.data
    

    first = 0 if pointer1.data is None else pointer1.data
    

    有可能 pointer1 没有,因此没有 data 指针1 None 数据 .

        2
  •  1
  •   Izaak Weiss    7 年前

    问题是你正在检查 pointer.data pointer 它将是None,因此当代码到达三元if时,它将首先尝试获取属性 data 来自无对象。

    您需要更改代码,以便它检查是否 无: first = 0 if pointer1 is None else pointer1.data