为什么分配给None会提示未定义变量

时间:2018-10-23 03:50:49

标签: python

我创建了一段代码来测试变量声明,

In [37]: price = {"apple": 3, "orange":1}                                                                         

In [38]: for key in price: 
    ...:     fruit = key                                                                                          
In [39]: fruit                                                                                                    
Out[39]: 'orange'

无需事先声明可变水果就可以工作,
尽管如此,

In [44]: cars = {}                                                                                                

In [45]: for key in cars: 
    ...:     car = key                                                                                            
In [46]: car                                                                                                      
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-46-38f6ffefbd69> in <module>
----> 1 car

NameError: name 'car' is not defined

提示未定义汽车,

In [51]: for key in cars: 
    ...:     print(type(car), dir(car))  
#it output nothing, key is None

但是None可以分配给汽车

In [52]: car = None                                                                                               
In [53]: car                                                                                                     
In [54]: i = car                                                                                                  
In [55]: i  

i is not defined

不是报告错误

这两种情况有什么区别?

4 个答案:

答案 0 :(得分:1)

price = {"apple": 3, "orange":1}

for key in price:
    fruit = key

print(fruit)

这一遍迭代字典中的键。当您简单地遍历字典(例如for x in dictionary)时,便会遍历其键。在循环中,您是将键分配给同一变量,而不是列表或任何其他数据结构,因此每次循环时都要替换。

cars = {}     

for key in cars: 
    car = key

print(car)

在这里,for循环不会迭代,因为字典是 empty ,所以Python无法识别car是什么。

字典为空表示其中没有任何物品,甚至没有None

cars = {}                              
print(cars)
# {}

答案 1 :(得分:1)

区别在于变量初始化。例如...

car = None

...将“ car”变量设置为“无”。在概述的第一个示例中,在第46行上未定义“ car”,因为循环从不迭代且变量从未初始化(因为“ cars”是空字典)。

答案 2 :(得分:1)

您误解了它的工作原理。

您的词典是空的,甚至没有None。迭代一个空的集合将被忽略。因此,for循环根本不会执行。

Python是一种完整的OO语言,这意味着其中的每个元素都是一个对象。 None也是如此。您可以将None添加到集合中。它将显示一个None。但就您而言,什么都没有。

答案 3 :(得分:1)

Cars中没有任何键(没有双关语),因此语句car = key将永远不会执行。

对于i = car而言,当您声明i = car时,我只是成为car指向的同一位置的引用,因此它返回与car相同的值也就不足为奇了