Is it possible only to declare a variable without assigning any value in Python?
是否可以像这样在python中声明变量?:
1 | var |
所以它初始化为"无"?似乎Python允许这样做,但一旦您访问它,它就会崩溃。这有可能吗?如果没有,为什么?
编辑:我想这样做的情况:
1 2 3 4 5 6 7 | value for index in sequence: if value == None and conditionMet: value = index break |
号复制
- python中未初始化的值(由同一作者提供)
- python中有声明关键字吗?(同一作者)
相关的
- python:变量范围和函数调用
- 其他语言有"变量"
为什么不这么做:
1 | var = None |
python是动态的,所以您不需要声明事物;它们自动存在于分配它们的第一个作用域中。所以,您所需要的只是一个常规的旧的分配语句,如上所述。
这很好,因为最终不会得到未初始化的变量。但是要小心——这并不意味着你最终不会得到错误初始化的变量。如果你给
我衷心建议您阅读其他语言中的"变量"(我将其添加为相关链接)–两分钟后,您就会知道python有"名称",而不是"变量"。
1 2 3 4 | val = None # ... if val is None: val = any_object |
我不知道你想干什么。Python是一种非常动态的语言;在实际分配或使用变量之前,通常不需要声明变量。我想你想做的只是
1 | foo = None |
号
它将值
编辑:你真正想做的是:
1 2 3 4 5 6 7 8 9 10 11 12 | #note how I don't do *anything* with value here #we can just start using it right inside the loop for index in sequence: if conditionMet: value = index break try: doSomething(value) except NameError: print"Didn't find anything" |
从这样一个简短的代码示例中,很难判断这是否真的是正确的样式,但这是一种更"Python式"的工作方式。
编辑:以下是JFS的评论(发布在此处以显示代码)
与OP的问题无关,但上述代码可以改写为:1 2 3 4 5 6 7 8 9 | for item in sequence: if some_condition(item): found = True break else: # no break or len(sequence) == 0 found = False if found: do_something(item) |
。
注:如果
不建议使用上述代码。它的目的是说明局部变量是如何工作的,也就是说,在这种情况下,"变量"是否"定义"只能在运行时确定。首选方式:
1 2 3 4 | for item in sequence: if some_condition(item): do_something(item) break |
或
1 2 3 4 5 6 7 8 | found = False for item in sequence: if some_condition(item): found = True break if found: do_something(item) |
。
在python 3.6+中,可以使用变量注释:
https://www.python.org/dev/peps/pep-0526/摘要
PEP484引入了类型提示,也就是A.K.A.类型注释。虽然它的主要焦点是函数注释,但它还引入了类型注释的概念来注释变量:
1 2 | # 'captain' is a string (Note: initial value is a problem) captain = ... # type: str |
PEP 526旨在为python添加语法,以注释变量类型(包括类变量和实例变量),而不是通过注释来表达:
1 | captain: str # Note: no initial value! |
号
它似乎更直接地符合您所问的"是否只可能声明一个变量而不在python中赋值?"
我通常将变量初始化为表示
1 | var ="" |
。
或
1 | var = 0 |
如果它将是一个对象,那么在实例化它之前不要初始化它:
1 | var = Var() |
。
好吧,如果你想检查一个变量是否被定义了,那为什么不检查它在locals()或globals()数组中?您的代码重写:
1 2 3 4 | for index in sequence: if 'value' not in globals() and conditionMet: value = index break |
号
如果是您要查找的局部变量,则将globals()替换为local s()。
如果我理解您的示例是正确的,那么无论如何,您不需要在if语句中引用"value"。一旦它可以被设置为任何值,你就会跳出这个循环。
1 2 3 4 5 6 | value = None for index in sequence: doSomethingHere if conditionMet: value = index break |
号
首先,我对你最初提出的问题的回答
问:如何发现代码中某个点是否定义了变量?
答:在源文件中读取,直到看到定义该变量的行为止。
但更进一步,您已经给出了一个代码示例,其中有各种各样的排列,它们都是非常Python式的。您正在寻找一种方法来扫描序列中符合条件的元素,因此这里有一些解决方案:
1 2 3 4 5 6 | def findFirstMatch(sequence): for value in sequence: if matchCondition(value): return value raise LookupError("Could not find match in sequence") |
。
显然,在这个例子中,您可以根据您想要实现的目标,用
如果你想要所有符合条件的东西,你可以这样做:
1 2 3 4 5 6 7 | def findAllMatches(sequence): matches = [] for value in sequence: if matchCondition(value): matches.append(value) return matches |
号
还有另一种方法可以使用
此外,实现这一目标的方法只有一条:
1 | all_matches = [value for value in sequence if matchCondition(value)] |
号
这是一个好问题,不幸的是,回答错误,因为
它与不进行赋值的定义不同。我仍在努力解决如何绕过这个问题。
您看起来像是在用Python编写C。如果您想在序列中找到一些东西,python有内置的函数来完成这项工作,比如
1 | value = sequence.index(blarg) |
号
你可以用这个难看的单行线来欺骗一个口译员。它除了向局部变量字典中添加一个变量
如果
1 | var = object() |
号
这个哨兵是尼克·科格伦建议的。
1 2 | var_str = str() var_int = int() |
号