Python 2.7 支持在 if else 语句中附加/扩展空变量

Posted

技术标签:

【中文标题】Python 2.7 支持在 if else 语句中附加/扩展空变量【英文标题】:Python 2.7 supportability for appending to/extending empty variables within if else statements 【发布时间】:2015-01-08 02:47:00 【问题描述】:

我目前正在通过 .extend() 初始化 if else 语句中的变量。在我的脚本结束时,我正在使用 xlwt 将变量写入 excel 文件。但是编译器会抛出以下错误:

Traceback (most recent call last):
 File "C:\Python27\cascade.py", line 171, in <module>
NameError: name 'correct_screw_match' is not defined>

目前我也在使用扩展,因为使用附加时会引发错误。

for i in range (no_of_screw)
 for iterator in range (0, read_limit, 2):
  if (excel_screw_centroid[iterator]-25) <= screw_centroid[i,1] <= (excel_screw_centroid[iterator]+25):
   if (excel_screw_centroid[iterator+1]-25) <= screw_centroid[i,0] <= (excel_screw_centroid[iterator+1]+25):
    correct_screw_match.extend(i)
    detected_a_screw = 1
   else:
    incorrect_screw_match.extend(i)
    detected_a_screw = 0

我认为原因是,变量是在 if else 语句中声明的。这就是为什么我在脚本的开头通过以下方式将变量初始化为空:

correct_screw_match = None

然而,这会带来以下问题:

Traceback (most recent call last):
 File "C:\Python27\cascade.py", line 106, in <module>
AttributeError: 'NoneType' object has no attribute 'extend'

下面的链接以简单的方式解释了如何声明一个空变量,以及如何在 if 语句中附加到它。然而,我不知道为什么以目前的方式这对我来说是不可能的。

Reference to declaring empty variables.

Reference to append to empty lists.

【问题讨论】:

使它成为一个空列表correct_screw_match = [] - 你怎么能extend 一个列表在它存在之前? Python 根本没有 “空变量” 概念 - 名称 correct_screw_match 是对 NoneType 对象的引用,它不是 @987654332 @ 和 不能extended。它不会猜测你的意思是什么类型的对象。 为此,appendextend 应该给出相同的结果。我理解你在写一些不存在的东西,但是由于我对 Python 比较陌生,而且我习惯于 C,这让我有点困惑,有些东西需要在分配之前声明,而有些东西不需要。但是由于某种原因,我也无法使用“附加”。 appendextend 的行为相同 - None 没有这两种方法,任何list 都有。你可能应该看看例如nedbatchelder.com/text/names.html 澄清这里发生了什么。 Python 是动态的,但是是强类型的 【参考方案1】:

这对你来说是不可能的,因为你没有这样做。您正在尝试对不是列表的值调用列表方法,这当然行不通。

需要先将变量设置为空列表,然后调用extend()

incorrect_screw_match = []
incorrect_screw_match.extend(i)

但是,当然上面的内容毫无意义,因为每次找到匹配项时它都会清除列表。

因此,解决方案是将初始化移动到循环之前

【讨论】:

实际上我需要在循环中使用'del',所以在for循环的顶部进行初始化是没有问题的,因为我使用xlwt将列表的内容写入底部for 循环。【参考方案2】:

你应该用一个空值初始化变量(大概是列表):

correct_screw_match = []

然后使用:

correct_screw_match.append(i)

...或者如果您必须使用extend:

correct_screw_match.extend([i])

【讨论】:

´correct_screw_match = None´ 所以这与 ´correct_screw_match = []´ 有点不同是因为第一个被声明为标量,而后者被声明为列表?但两者都未分配? None 指的是NoneType 的对象; [] 是一个创建 list 类型的对象(特别是一个空列表)。 Python 没有标量(您似乎在考虑 Perl);它只是有对象,每个对象都有一个类型。 None 和空列表的唯一共同点是在布尔上下文中考虑时两者都被视为“假”。它们不可互换。 @chepner 说的,真的。底线是:它们被分配了,但你不能在NoneType 上调用append,因为它没有这样的方法(或者根本没有它自己的任何方法)。请记住,Python 有strong typing,并不弱,所以NoneType 不会神奇地改变。【参考方案3】:

人们常说“Python 没有变量”。这并不完全正确,但是这个简洁的小短语试图表示的是所有 Python 变量只是引用对象的名称。当你说

x = 3

您没有声明一个名为 x 的变量并将其初始化为 3;您只是让名称 x 引用值为 3 的 int 对象。同样,

y = x

不创建取自x值的新对象;它只是使y 成为对x 所引用的同一对象的引用。

不是变量有方法extend,而是变量引用的对象。此外,objects 有方法,而不是变量。在行中

correct_screw.extend(i)

correct_screw 必须首先使用extend 方法引用对象,然后才能调用该方法。在这种情况下,您需要一个list 对象,因此您必须首先让correct_screw 引用这样一个对象。这不是声明一个变量,而是让一个名称引用一个可用的对象。

correct_screw = list()   # Using the type to create an empty list

或者更简洁

correct_screw = []  # Using a list literal

由于名称是由赋值语句创建的,并且名称本身没有类型,因此您可以通过为其分配 any 值来确保名称存在;分配左侧的名称不需要(实际上,通常不存在)之前存在。但是,任何使用名称调用方法的尝试都要求名称既存在又引用正确类型的对象。这就是为什么correct_screw = None 确实创建了名称correct_screw(因此您以后不会得到NameError),但没有使它引用正确类型的对象以供后续调用extend


根据您在其他地方的用法和 cmets,您似乎认为 None[] 与 Perl 中的 undef() 具有相似的关系,它们在某种程度上可以互换。但是,Python 是一种强类型语言,而 Perl 不是。

【讨论】:

以上是关于Python 2.7 支持在 if else 语句中附加/扩展空变量的主要内容,如果未能解决你的问题,请参考以下文章

Python 2.7 学习笔记 条件与循环语句

python-判断循环语句

第4天python学习 条件和 循环语句

Python:为啥 if-else 一行语句在 else 中不能与 continue 一起使用?

Python新手学习基础之条件语句——if/else语句

python基础--条件语句if else