Python中是否有任何声明关键字?

时间:2009-02-20 22:34:35

标签: python variables

python中是否有任何声明关键字,如本地,全局,私有,公共等。我知道它是免费的类型,但你怎么知道这句话:

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

  • 设置现有的。

5 个答案:

答案 0 :(得分:15)

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

如果您想知道在查看代码时如何识别它,您只需查找以前的分配。避免使用全局变量,这无论如何都是一种好的做法,并且你将全力以赴。

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

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

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

soapbox alert !!!

尽管Python看起来有点松散 - 过去常常不得不一遍又一遍地输入类名(或类型)......但实际上它与你想要的一样严格。

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

assert(isinstance(variable, type))

装饰器的存在是为了方便函数调用......

不久之后,您可能会得出结论:静态类型检查(在编译时)实际上并没有使您的代码更好。只需要在整个地方获得冗余类型信息的成本只有很小的好处。

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

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

在python中看起来像:

win = createPopup(parent, ThingPicker)

我可以看到,在动作脚本代码中,静态类型检查没有任何好处。变量的生命周期很短,以至于我必须完全醉了才能用它来做错误的事情......让编译器通过指出类型错误来保存我。

答案 1 :(得分:14)

理解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官方文档中关于可变对象(可以更改)和不可变对象(无法更改)之间差异的最全面讨论

答案 2 :(得分:12)

值得一提的是,有一个全局关键字,所以如果你想引用全局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

答案 3 :(得分:7)

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

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

var x = 5;

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

Python 具有此功能。程序员必须确保他或她不会重新分配先前存在的名称。

答案 4 :(得分:0)

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

x = 5

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

if __name__ == "__main__":
    test()

所以如果globals()中的'variablename':     声明是一项任务 除此以外     声明是声明