python中是否有任何声明关键字,如本地,全局,私有,公共等.我知道它是免费的类型但你怎么知道这句话:
x = 5;
创建一个新变量.
要么
设置现有的一个.
Jim Carroll.. 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)
我可以看到,在动作脚本代码中,静态类型检查没有任何好处.变量的生命周期很短,以至于我必须完全醉了才能用它来做错误的事情......让编译器通过指出类型错误来保存我.
我非常喜欢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)
我可以看到,在动作脚本代码中,静态类型检查没有任何好处.变量的生命周期很短,以至于我必须完全醉了才能用它来做错误的事情......让编译器通过指出类型错误来保存我.
理解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数据模型的官方文档中对可变对象(可以更改)和不可变对象(无法更改)之间的区别进行最完整的讨论.
值得一提的是,有一个全局关键字,所以如果你想引用全局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
它看起来不像提问者正在尝试分配一个类型,只是为了指定这是一个声明,而不是一个赋值.
看起来你正在寻找类似javascript的东西:
var x = 5;
javascript中声明关键字的概念是确保您在当前作用域中创建一个新对象,而不是简单地更改同名的其他变量.
Python不不具备此功能.程序员必须确保他或她不会重新分配先前存在的名称.