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

Joa*_*nge 11 python variables

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

x = 5;
Run Code Online (Sandbox Code Playgroud)
  • 创建一个新变量.

要么

  • 设置现有的一个.

Jim*_*oll 15

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

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

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

try:
    x
except NameError:
    # x doesn't exist, do something
else:
    # x exists, do something else
Run Code Online (Sandbox Code Playgroud)

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

肥皂盒警报!

即使Python看起来有点松散 - 往往习惯于不得不一遍又一遍地输入类名(或类型)......实际上它与你想要的一样严格.

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

assert(isinstance(variable, type))
Run Code Online (Sandbox Code Playgroud)

存在的装饰器以非常方便的方式进行函数调用...

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

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

var win:ThingPicker = PopUpManager.createPopUp(fEmotionsButton, 
       ThingPicker, false) as ThingPicker;
Run Code Online (Sandbox Code Playgroud)

在python中看起来像:

win = createPopup(parent, ThingPicker)
Run Code Online (Sandbox Code Playgroud)

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


Van*_*ale 14

理解Python的一个重要事情是没有变量,只有"名称".

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

如果以后你做:

x = "Some string"
Run Code Online (Sandbox Code Playgroud)

这仍然完全有效.名称"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
Run Code Online (Sandbox Code Playgroud)

编辑2:在Python数据模型的官方文档中对可变对象(可以更改)和不可变对象(无法更改)之间的区别进行最完整的讨论.

  • 这些都是好点,但我想错过了这个问题.提问者想要确保它们不会覆盖现有对象(如javascript中的"var"语句).他们没有尝试分配类型. (2认同)

Dan*_*ana 12

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

x = 4
def foo():
    x = 7 # x is local to your function
Run Code Online (Sandbox Code Playgroud)

你需要这样做:

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


TM.*_*TM. 7

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

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

var x = 5;
Run Code Online (Sandbox Code Playgroud)

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

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