【问题标题】:scoping and typing rules in pythonpython中的范围和类型规则
【发布时间】:2015-05-10 06:35:29
【问题描述】:

我是 python 编程的初学者,我编写了以下程序以尝试理解范围和类型规则。

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

我得到以下输出。

  5
  Hello World

我知道变量是在 python 中动态输入的。当a=5 赋值发生时,解释器理解'a' 是一个整数。 为什么给同一个变量赋值字符串时不报错

【问题讨论】:

  • 类似的问题有一些很好的答案stackoverflow.com/questions/11007627/…
  • 顺便说一句,这真的与范围规则无关。您刚刚在这里获得了(模块)全局范围。您只能通过定义函数和类来获得新的作用域。 (嗯,这不是完全正确,但现在已经足够接近了。)
  • 当同一个变量被赋值为字符串值时不会报错,因为 Python 使用动态类型。这就是它的全部重点。如果无法更改对象类型,它们就不会是动态的。

标签: python


【解决方案1】:

Python 中的变量没有类型。它们只是价值的名称。当然,这些值确实有类型,但变量不在乎。正如“John”可以是一个人的名字,也可以是另一个人的名字,a 可以是你程序的一部分中的 int 和另一部分中的 str


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

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

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

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


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


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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      让我们逐行查看程序,看看发生了什么..

      第 1 行 - 您插入一个值 5 并将其分配给名为“a”的标签

      第 2 行 - 打印标签“a”

      第 3 行 - 您插入一个名为“hello world”的值并将其分配给标签“a”,标签“a”现在指向值“hello world”而不是值 5。

      第 4 行 - 打印标签“a”

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

      【讨论】:

        猜你喜欢
        • 2015-06-02
        • 2012-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 2022-10-24
        • 1970-01-01
        • 2017-07-29
        相关资源
        最近更新 更多