【问题标题】:Why assign to None prompts that variable is not defined为什么赋值给None提示未定义变量
【发布时间】:2018-10-23 03:50:49
【问题描述】:

我创建了一个 sn-p 代码来测试变量声明,

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

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

无需提前声明变量fruit即可工作,
尽管如此,

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不是报错,

这两种情况有什么区别?

【问题讨论】:

  • 提示:在后一种情况下,您正在遍历一个完全空的字典...

标签: python


【解决方案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 循环不会迭代,因为字典 为空,因此 Python 无法识别 car 是什么。

字典为空表示里面没有项目,甚至没有None

cars = {}                              
print(cars)
# {}

【讨论】:

  • 所以这里是if?
  • @riderdragon,你能说清楚你在问什么吗?抱歉,我没听懂。
【解决方案2】:

区别在于变量初始化。比如……

car = None

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

【讨论】:

    【解决方案3】:

    您误解了它的工作原理。

    你有一个空字典,里面甚至没有None。并且迭代一个空集合被忽略。所以for 循环根本不会执行。

    Python 是一门完整的 OO 语言,这意味着其中的每个元素都是一个对象。 None 也是如此。您可以将None 添加到集合中。它会告诉你有一个None。但在你的情况下,什么都没有。

    【讨论】:

      【解决方案4】:

      Cars 里面没有任何键(没有双关语),所以语句car = key 永远不会被执行。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多