python中是否有任何声明关键字,如本地,全局,私有,公共等。我知道它是免费的类型,但你怎么知道这句话:
x = 5;
或
答案 0 :(得分:15)
我非常喜欢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)
我可以看到,在动作脚本代码中,静态类型检查没有任何好处。变量的生命周期很短,以至于我必须完全醉了才能用它来做错误的事情......让编译器通过指出类型错误来保存我。
答案 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': 声明是一项任务 除此以外 声明是声明