python中的作用域和输入规则

时间:2015-05-10 06:35:30

标签: python

我是python编程的初学者,我编写了以下程序,试图了解范围和输入规则。

  a = 5                                                                                                                                                                                                 
  print(a)
  a = "Hello World"
  print(a)

我得到以下输出。

  5
  Hello World

我知道变量是在python中动态输入的。口译员理解' a'是a=5赋值发生时的整数。 为同一个变量分配字符串值

时,为什么会出错?

3 个答案:

答案 0 :(得分:9)

Python中的变量没有类型。它们只是价值观的名称。当然,这些值确实有类型,但变量并不关心。正如“John”可以是一个人在一个对话中的名称或者在另一个对话中的poodle的名称,a可以是程序的一部分中int的名称和str在另一部分。

这是Python中变量与您可能来自的任何语言之间更大差异的一部分。

在C ++中,变量实际上定义了内存中值可以存活的位置。例如,int变量有4个字节的内存,当你写a = 42时,它会将数字42复制到这4个字节中。

在Python中,变量只是定义了对一个值的引用,该值在堆上的某个地方有自己的生命。当然,值的存储仍然必须有一个类型,但变量不是值的存储。

(如果C ++确实是您最熟悉的语言,那么将每个Python变量视为std::shared_ptr<boost::any>类型可能会有所帮助。)

有些程序能够为不同类型重用变量名称是有用的,但还有一些程序更有可能是一个bug而不是故意的。有一些静态分析器,如mypy,您可以使用它来检查此类错误。在大多数情况下,自动类型推断足以确定您希望变量的类型,并确保您始终使用该类型。如果不是,PEP 484(可能是Python 3.5的一部分,并且主要由mypy处理)标准化了一种帮助这些分析器的方法,为它们提供了明确的类型提示。

最后一件事:如果你很好奇这是如何工作的,那么在Python中,每个范围的命名空间都只是一个字典。当您在模块 - 全局级别编写a = 5时,它就像执行g['a'] = 5一样,其中g是模块的字典。本地和闭包有一些棘手的问题,但基本上,这是变量如何工作的关键。

答案 1 :(得分:5)

变量在Python中没有类型。对象有类型。 “变量”只是附加到对象的名称。示例中的名称a只是一个标签。您可以将它附加到任何类型的对象。

答案 2 :(得分:0)

让我们逐行了解程序以及正在发生的事情..

第1行 - 您插入一个值5并将其分配给名为&#34; a&#34;

的标签

第2行 - 打印标签&#34; a&#34;

第3行 - 您插入一个名为&#34; hello world&#34;并将其分配给标签&#34; a&#34;标签&#34; a&#34;现在指向价值&#34;你好世界&#34;而不是值5。

第4行 - 打印标签&#34; a&#34;

理解python解释的一个好方法是使用可视化工具。这是一个很好的在线免费应用程序。它为您提供了逐步执行程序的想法。 link to visualizer