Python中有任何声明关键字吗?
Python中有任何声明关键字吗?
这个问题已经在这里有了答案:
在Python中是否有声明关键字,如local
,global
,private
,public
等?我知道Python中不指定变量类型; 但如何知道代码x = 5
创建了一个新变量还是设置了一个现有变量?
Python中一个重要的概念是,没有变量,只有 "名称"。
在你的例子中,你有一个对象 "5", 然后你创建了一个名字 "x",它引用了对象 "5"。
如果之后你执行:
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数据模型的官方文档。
我真的很喜欢 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 代码中,静态类型检查并没有什么好处。变量的寿命如此之短,以至于我必须彻底醉醺才能做错事情……并且编译器还会通过指出类型错误来拯救我。