【问题标题】:Are there any declaration keywords in Python?Python中有声明关键字吗?
【发布时间】:2010-10-08 23:05:29
【问题描述】:

python中是否有任何声明关键字,例如local、global、private、public等。我知道它是无类型的,但你怎么知道这个语句:

x = 5;
  • 创建一个新变量。

  • 设置一个现有的。

【问题讨论】:

  • 你为什么在乎?这怎么可能呢?您能否扩展您的问题以解释您为什么关心?
  • 谁打字免费? Python?它是一种具有动态类型解析的强类型语言,而不是一种无类型语言。
  • 我很在意,因为我想知道一个变量是刚刚被创建还是被替换。

标签: python variables


【解决方案1】:

我刚刚意识到还有一个更直接的答案:

x = 5

def test():
    print 'x' in globals()

if __name__ == "__main__":
    test()

因此,如果 globals() 中的“变量名”: 该语句是一个赋值 否则 该声明是一个声明

【讨论】:

    【解决方案2】:

    我真的很喜欢 Van Gale 提供的理解,但它并没有真正回答“你怎么知道这个语句是创建一个新变量还是设置一个现有变量?”的问题?

    如果您想知道在查看代码时如何识别它,您只需查找以前的作业。避免使用全局变量,这无论如何都是一个好习惯,你会做好准备的。

    以编程方式,您可以尝试引用该变量,并查看是否出现“名称错误”异常

    try:
        x
    except NameError:
        # x doesn't exist, do something
    else:
        # x exists, do something else
    

    我从来不需要这样做......我怀疑你是否真的需要这样做。

    肥皂盒警报!!!

    尽管对于习惯于一遍又一遍地输入类名(或类型)的人来说,Python 看起来有点松散……但它实际上完全符合您的要求。

    如果你想要严格的类型,你会明确地这样做:

    assert(isinstance(variable, type))
    

    装饰器的存在是为了以一种非常方便的方式进行函数调用...

    不久之后,您可能会得出这样的结论:静态类型检查(在编译时)实际上并没有使您的代码变得更好。必须在所有地方都有冗余类型信息的成本只有一点点好处。

    我目前正在使用 actionscript,并输入以下内容:

    var win:ThingPicker = PopUpManager.createPopUp(fEmotionsButton, 
           ThingPicker, false) as ThingPicker;
    

    在python中看起来像:

    win = createPopup(parent, ThingPicker)
    

    我可以看到,查看 actionscript 代码,静态类型检查根本没有任何好处。变量的生命周期如此之短,以至于我必须完全喝醉才能用它做错事......并让编译器通过指出类型错误来拯救我。

    【讨论】:

    • +1:谢谢吉姆。我没有注意到琼可能会问一个名称是否已经在引用一个对象,但如果是这样的话,我第二个 S. Lott 的问题,为什么?经过更多时间思考后,我希望我能先讨论可变性,而不是在最后进行链接。
    • @Van:为什么?你能告诉我为什么不吗?
    • @Joan:甚至 Jim 在他的回答中也说过,“我从来不需要这样做。”原因是我在回答中解释得不好。
    • 谢谢,我明白了。但是你怎么知道是否已经定义了名为 x、y 或 z 的全局变量呢?
    • @Joan:Python 有很多命名空间......实际上,您认为全局变量实际上位于模块的命名空间中。唯一真正出现 global 的地方是如果您在交互式 python 提示符下。在这种情况下,您只需键入 >>> x(返回)并查看是否收到 NameError。
    【解决方案3】:

    了解 Python 的重要一点是没有变量,只有“名称”。

    在您的示例中,您有一个对象“5”,并且您正在创建一个引用对象“5”的名称“x”。

    如果以后你这样做:

    x = "Some string"
    

    这仍然是完全有效的。名称“x”现在指向对象“Some string”。

    这不是类型冲突,因为名称本身没有类型,只有对象。

    如果你尝试 x = 5 + "Some string" 你会得到一个类型错误,因为你不能添加两个不兼容的类型。

    换句话说,它不是免费的。 Python 对象是强类型的。

    这里有一些关于 Python 类型的非常好的讨论:

    编辑:要完成将其与您的问题联系起来,名称可以引用现有对象或新对象。

    # Create a new int object
    >>> x = 500
    # Another name to same object
    >>> y = x
    # Create another new int object    
    >>> x = 600
    # y still references original object
    >>> print y
    500
    # This doesn't update x, it creates a new object and x becomes
    # a reference to the new int object (which is int because that
    # is the defined result of adding to int objects).
    >>> x = x + y
    >>> print x
    1100
    # Make original int object 500 go away
    >>> del y
    

    编辑2:在Python Data Model的官方文档中对可变对象(可以改变)和不可变对象(不能改变)的区别进行了最完整的讨论。

    【讨论】:

    • 这些都是好点,但我认为错过了这个问题。提问者希望确保他们不会覆盖现有对象(如 javascript 中的“var”语句)。他们没有尝试分配类型。
    • 是的,你是对的,我的意思是通过引入 Python 对象的必要介绍来解决这个问题 :) 编辑我的答案以完成它。
    • 实际上整数是不可变的,因为x = 500 可以将现有的整数对象绑定到x 而不是创建一个新的 (id(500) == id(x); id(250+250) 可能等于 id(x ); `L=[]; id(L) != id([]))。不可变对象(整数、字符串)的字面量可以被视为花哨的名称。
    • 说“Python 没有变量”是没有帮助的。你的意思是,“Python 变量的工作方式与 C 不同。”
    • "没有变量,只有名字" => 像我这样来自 C# 或 Java 世界的人真的不喜欢变量声明没有关键字:(
    【解决方案4】:

    值得一提的是有一个全局关键字,所以如果要引用全局x:

    x = 4
    def foo():
        x = 7 # x is local to your function
    

    你需要这样做:

    x = 4
    def foo():
        global x # let python know you want to use the top-level x
        x = 7
    

    【讨论】:

      【解决方案5】:

      看起来提问者并没有试图分配一个类型,只是为了指定这是一个声明,而不是一个赋值。

      看起来你正在寻找类似 javascript 的东西:

      var x = 5;
      

      javascript中声明关键字的概念是确保您在当前范围内创建一个新对象,而不是简单地更改一些其他同名变量。

      Python没有有这个特性。程序员必须确保他或她没有重新分配预先存在的名称。

      【讨论】:

      • 我的错!更正了问题。
      • 这是错的。如果 x 没有定义,你会得到 NameError: name 'x' is not defined。如果 x 在布尔上下文中设置为 0、False、[]、()、""、set() 或其他 False 值,它将落入 else 块。
      • @recursive... 您必须拥有旧版本的页面。我在您发表评论前大约 5 分钟修复了。
      猜你喜欢
      • 2017-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-25
      • 2017-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多