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

时间:2014-11-11 14:10:38

标签: python python-2.7

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

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

目前我也在使用extend,因为在使用append时会抛出错误。

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.

3 个答案:

答案 0 :(得分:2)

它经常说&#34; Python没有变量&#34;。这并不完全正确,但那个简洁的小词试图表示的是,所有Python变量都只是引用对象的名称。当你说

x = 3

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

y = x

不会创建一个新对象,其值取自x的值;它只是使y引用x引用的同一个对象。

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

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

因为名称是由赋值语句创建的,并且名称本身没有输入,所以可以通过为其指定任何值来确保名称存在;作业左侧的名称不需要(事实上,通常确实不存在)之前存在。但是,任何使用名称调用方法的尝试都要求名称都存在并引用正确类型的对象。这就是correct_screw = None确实创建名称correct_screw的原因(因此您以后不会获得NameError),但不会使其引用正确类型的对象随后调用extend


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

答案 1 :(得分:1)

您应该使用空值初始化变量(可能是列表):

correct_screw_match = []

然后使用:

correct_screw_match.append(i)

...或者必须使用extend

correct_screw_match.extend([i])

答案 2 :(得分:0)

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

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

incorrect_screw_match = []
incorrect_screw_match.extend(i)

但是,当然上面没有任何意义,因为每次找到匹配项时它都会清除列表。

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