Python中有任何声明关键字吗?

Python中有任何声明关键字吗?,python,variables,Python,Variables,python中是否有任何声明关键字,如local、global、private、public等。我知道它是无类型的,但您如何知道该语句: x = 5; 创建一个新变量 或 设置一个现有的 关于Python,需要了解的一件重要事情是没有变量,只有“名称” 在您的示例中,您有一个对象“5”,并且您正在创建一个引用对象“5”的名称“x” 如果以后您这样做: x = "Some string" 这仍然是完全正确的。名称“x”现在指向对象“某个字符串” 这不是类型冲突,因为名称本身没有类型,只有

python中是否有任何声明关键字,如local、global、private、public等。我知道它是无类型的,但您如何知道该语句:

x = 5;
  • 创建一个新变量

  • 设置一个现有的

关于Python,需要了解的一件重要事情是没有变量,只有“名称”

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

如果以后您这样做:

x = "Some string"
这仍然是完全正确的。名称“x”现在指向对象“某个字符串”

这不是类型冲突,因为名称本身没有类型,只有对象

如果您尝试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:在的官方文档中,对可变对象(可以更改)和不可变对象(不能更改)之间的区别进行了最完整的讨论。

看起来询问者并不是试图分配类型,只是指定这是一个声明,而不是分配

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

var x = 5;
javascript中声明关键字的概念是确保在当前范围内创建新对象,而不是简单地更改其他同名变量


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

我真的很喜欢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代码,静态类型检查没有任何好处。变量的生命周期如此之短,以至于我必须完全喝醉才能用它做错误的事情。。。让编译器指出一个类型错误来拯救我

我刚刚意识到还有一个更直接的答案:

x = 5

def test():
    print 'x' in globals()

if __name__ == "__main__":
    test()
因此,如果globals()中的“variablename”: 该语句是一个赋值 否则
该声明是一项声明

这些都是好的观点,但我认为遗漏了问题。询问者希望确保他们没有覆盖现有对象(如javascript中的“var”语句)。他们没有试图分配类型。是的,你是对的,我想通过引入必要的Python对象介绍来解决这个问题:)编辑我的答案以完成它。实际上整数是不可变的,因为
x=500
可以将现有的整数对象绑定到
x
,而不是创建一个新的(
id(500)==id(x)
;id(250+250)可以等于id(x);`L=[];id(L)!=id([])。不可变对象(整数、字符串)的文本可以看作是花哨的名称。说“Python没有变量”是没有帮助的。你的意思是,“Python变量的工作方式不同于C语言。”“没有变量,只有名称”=>像我这样来自C#或Java世界的人会非常不喜欢变量声明没有关键字:(我的错误!更正了问题。这是乘错。如果未定义x,则会得到名称错误:未定义名称“x”。如果x设置为0,则为False,[],(),“”,set(),或布尔上下文中的其他假值,它将转到else块。@recursive…您必须拥有该页面的旧版本。我在您发表评论之前大约5分钟修复了该问题。您为什么关心?这可能有什么关系?您能否扩展您的问题以解释为什么关心?谁是无类型的?Python?这是一种带有d的强类型语言动态类型解析,不是一种无类型语言。我之所以关心,是因为我想知道一个变量是刚刚被创建还是被替换。+1:谢谢Jim。我还没发现Joan可能会问一个名称是否已经引用了一个对象,但如果是这样的话,我支持s.Lott的问题,为什么?在花更多的时间思考之后,我希望我能回答“我会从易变性讨论开始,而不是在最后联系起来。@Van:为什么?你能告诉我为什么不吗?@Joan:甚至Jim在他的回答中都说,“我从来都不需要这样做。”原因是我在回答中解释得不好。谢谢,我明白了。但是你怎么知道是否已经定义了名为x、y或z的全局变量?@Joan:Python有很多名称空间……实际上,你不是