Python中是否有声明关键字,如local、global、private、public等?我知道在Python中没有指定变量类型;但是如何知道代码x = 5是创建一个新变量,还是设置一个现有变量?
发布于 2009-02-21 00:21:28
我非常喜欢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代码,静态类型检查根本没有好处。这个变量的生命周期太短了,我必须完全喝醉才能做错事.并让编译器通过指出类型错误来保存我。
发布于 2009-02-20 22:46:25
关于Python,需要理解的一件重要事情是没有变量,只有“名称”。
在您的示例中,您有一个对象"5“,并且正在创建一个引用对象"5”的名称"x“。
如果以后你这样做了:
x = "Some string"这仍然是完全正确的。名称"x“现在指向对象”一些字符串“。
它不是类型冲突,因为名称本身没有类型,只有对象。
如果您尝试x=5+“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数据模型的正式文档中最完整地讨论可变对象(可以更改)和不可更改对象(不可更改的对象)之间的区别。
发布于 2009-02-20 23:09:54
值得一提的是,有一个全局关键字,所以如果您想要引用全局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 = 7https://stackoverflow.com/questions/571514
复制相似问题