python 三元 if 语句没有捕获 None
python ternary if statement does not catch None
我正在实现将 python 中两个链表中的两个数字相加的算法。 (来自破解编码面试2-5)
例如,
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
我在使用 ternary operator
时是否遗漏了什么?
谢谢!
问题是您正在检查 pointer.data
是否为 None。但实际上 pointer
将是 None,因此当您的代码到达三元 if 时,它将首先尝试从 None 对象中获取属性 data
。
您需要更改您的代码,以便它检查 pointer
是否为 None:first = 0 if pointer1 is None else pointer1.data
是的,您实际上并没有执行 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
是 None,因此没有 data
属性,这就是您得到异常的原因。所以你需要在访问data
.
之前检查pointer1
不是None
我正在实现将 python 中两个链表中的两个数字相加的算法。 (来自破解编码面试2-5)
例如,
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
我在使用 ternary operator
时是否遗漏了什么?
谢谢!
问题是您正在检查 pointer.data
是否为 None。但实际上 pointer
将是 None,因此当您的代码到达三元 if 时,它将首先尝试从 None 对象中获取属性 data
。
您需要更改您的代码,以便它检查 pointer
是否为 None:first = 0 if pointer1 is None else pointer1.data
是的,您实际上并没有执行 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
是 None,因此没有 data
属性,这就是您得到异常的原因。所以你需要在访问data
.
pointer1
不是None