Python 列表:NoneType 对象在 for 循环中没有附加属性

在本文中,我们将了解在执行“for 循环”(执行将项目追加到列表的任务)期间发生的情况背后的可能原因,抛出异常,显示“NoneType”对象没有“append( )’ 属性。

我们将详细研究列表是什么、它们如何工作,并找出这个问题是如何发生的,并找出解决这个问题的方法。

Python 列表简介

列表是数组的 Python 版本,其增强功能为我们作为开发人员提供了更多功能。

列表不需要特定的数据类型,这意味着,正如我们所知,在数组中,您只能存储一种数据类型的元素,但对于列表来说,可以在数组中添加不同数据类型的元素。相同的列表。

Python 列表是动态列表。动态列表意味着它们没有固定的大小。因此,我们可以添加任意数量的数字,而无需在声明列表时声明列表的大小。

该列表提供了各种有用的函数,例如 pop()、append() 等,并且还具有列表理解等强大的功能。

下面给出了 python 列表的基本语法以及示例:

list_name = [element1, element2, ..., elementn]
1
2
my_list = [1, 2, 'Three', 4.0]
print(my_list)
列表示例

“append()”方法的用途是什么?

到目前为止,我们知道 Python 列表附带了各种函数/方法来处理和操作它们。“append()”方法也是对列表执行某些操作的函数。

Python 列表是可变的,这意味着即使在声明之后我们也可以对列表进行更改,例如添加元素或删除列表的元素。

“append()”方法是一种用于将元素添加到列表最后一个索引末尾的工具。 

我们可以在下面的示例中看到语法以及如何使用append()方法:

list_name.append(element)
1
2
3
4
5
my_list.append(5)
print(my_list)
 
my_list.append('SIX')
print(my_list)
列表追加示例

“NoneType”错误

Python 中的“NoneType”对象是什么?

在Python拥有的各种数据类型中,NoneType也包含在其中。“None”关键字用于表示 NoneType。此数据类型用于不存在该值的地方。

NoneType 只能有一个值,即“None”。通常类似于未获取有效值的变量或函数。 

您可以在下面的示例中看到“NoneType”对象的示例:

1
2
3
x =  None
print(x)
print(type(x))
无类型对象

上面的代码显示了“None”对象的声明,显示了它的值,还显示了它的数据类型,即“NoneType”。

“NoneType”对象没有属性“append”异常

异常的解释

这是当我们尝试将 append() 方法与 None 对象一起使用时发生的常见 Python 错误。正如我们所见,“NoneType”对象只有一个值“None”。

append() 方法是一个可与可变对象列表一起使用的函数。因此,append() 方法不能与 None 对象结合使用。

让我们看一些触发此异常的常见示例。

异常的常见原因

这是一个非常简单的示例,我们尝试在 None 对象上使用append()。

1
2
x = None
x.append(2)

在第二个示例中,我们尝试对函数返回的 None 值使用append()。

1
2
3
4
5
def my_function():
  return None
 
my_var = my_function()
my_var.append("Hello")

在此示例中,append() 用于列表中已经为“None”的元素。

1
2
a_list = [[5,3,1], None, [6,1,4]]
a_list[1].append(9)

在“for”循环中使用“append()”

要了解Python For 循环的工作原理,请阅读链接的文章。

在“for”循环中使用“append()”的概述

我们将借助一个简单的示例来了解在循环中使用“append()”方法的过程。

1
2
3
4
5
6
7
my_list = []
 
for i in range(1,11):
  my_list.append(i)
 
 
print(my_list)

在上面的代码中,我们刚刚在第 1 行中声明了一个列表,然后我们启动了一个循环,该循环将循环直到第 2 行中的 ‘i’ 从 1 达到 10。第 3 行显示了循环中 append() 的用法,并且最后,在第 5 行中,我们打印了新创建的列表。

使用附加循环示例

潜在的错误或问题

我们已经讨论了可能导致“NoneType”对象没有“append()”属性异常的常见场景,这些是循环内也可能发生的潜在错误和问题的完美示例。

所有的例子都是一样的;唯一的区别是上述情况是作为一般情况呈现的,因为在这里,它们需要在循环内呈现。

为了更好地理解,让我们看一下上述案例中的一个示例,我们将使用第一种情况,即附加到 None 对象。 

my_list = None
 
for i in range(1,11):
  my_list.append(i)
 
 
print(my_list)

正如您所看到的,运行上面的代码会导致与我们在上一节中看到的相同的异常。

避免“NoneType”错误

防止“NoneType”错误的最佳实践

为了避免“NoneType”错误,我们可以做的一件事是在对其执行任何操作操作之前显式初始化列表。

该列表可以显式初始化,如下所示:

cars = []

这样做将防止变量获得无效值,并表明它已被声明为目前为空的列表。 

我们需要确保的另一件事是,是否没有函数或条件语句返回“None”值。 

“for”循环中的输入验证和类型检查

输入验证非常重要,因为它是导致“NoneType”错误的主要原因之一。收到的输入并不总是我们要求的格式。

因此,我们有必要正确验证输入并确保其采用所需的格式,以便输入数据不会创建任何无效数据或“无”对象。 

类型检查可以使用另一个名为“isinstance()”的函数来完成,我们可以在使用它追加之前使用它来检查“NoneType”对象。让我们通过一个例子来理解这一点:

1
2
3
4
5
6
7
8
9
numbers = []
for i in range(1,11):
  if isinstance(numbers, list):
    numbers.append(i)
  else:
    print("Invalid Input.")
    break
 
print(numbers)
类型检查成功示例

上面是一个没有问题的例子,让我们看一个类型检查机制返回 false 的例子:

1
2
3
4
5
6
7
8
9
numbers = 2
for i in range(1,11):
  if isinstance(numbers, list):
    numbers.append(i)
  else:
    print("Invalid Input.")
    break
 
print(numbers)
类型检查失败示例

正如我们在第三行中看到的,我们使用了 isinstance() 函数,它根据我们传递的类型检查传递的参数。如果两者相同,则返回 True,否则返回 False。 

调试和错误处理

识别和调试用户root的技术

调试和错误处理的第一步是了解错误以及触发错误的原因。

Python有非常不言自明的错误提示,所以我们必须练习仔细阅读错误提示,以便我们了解错误是什么,因为要找到解决方案,我们需要首先了解问题所在。

错误提示还显示了导致错误的代码所在的位置。我们可以简单地导航到该行并尝试使用我们现在获得的知识来修复错误。

让我们尝试实现一个 try 和 except 块,以便程序不会突然中断,但在出现错误时必须优雅地完成。

使用 try 和 except 块来处理此错误

我们将在给定示例的帮助下看到 try 和 except 块的使用。要了解try 和 except 块在 Python 中的工作原理,请阅读链接的文章。

1
2
3
4
5
6
7
8
9
10
cars = None
c1 = "Scorpio N"
try:
    cars.append(c1)
except AttributeError:
    print("Error: 'NoneType' object has no attribute 'append'")
    cars = []
    cars.append(c1)
 
print(cars)
尝试排除块示例

上面的示例显示了 try 块如何捕获错误并在发生任何错误时执行交替任务。

概括

为了结束本文,让我们回顾一下本文中介绍的内容。我们首先了解什么是列表、它们如何有用以及列表附带的各种属性和方法。

然后我们深入了解了“NoneType”对象,了解了它是什么以及与之相关的问题是什么。

我们讨论了如何在循环内使用append()方法,然后还讨论了实现该方法时可能出现的问题。

最后,我们讨论了一些可以遵循的做法,以避免与“NoneType”对象相关的错误,并且还了解了一些输入验证技术。

最后,我们看到了如何理解错误提示并识别导致错误的代码,最后了解了 try 和 except 块是如何工作的以及如何使用它来避免我们关心的问题。

参考

Python 官方文档

Stackoverflow 查询