我的Google-fu让我失望了.
在Python中,以下两个相等的测试是否等效?
n = 5
# Test one.
if n == 5:
print 'Yay!'
# Test two.
if n is 5:
print 'Yay!'
Run Code Online (Sandbox Code Playgroud)
对于您要比较实例的对象(list
比如说),这是否适用?
好的,所以这样的答案我的问题:
L = []
L.append(1)
if L == [1]:
print 'Yay!'
# Holds true, but...
if L is [1]:
print 'Yay!'
# Doesn't.
Run Code Online (Sandbox Code Playgroud)
所以==
测试值测试的地方is
是否是同一个对象?
存在用于Python的静态分析工具,但编译时间检查往往与Python所包含的运行时绑定哲学截然相反.这可能与一个静态分析工具来执行一些"包装标准Python解释器使用严格 "般的约束,但我们没有看到任何广泛采用的这样的事情.
有没有关于Python的东西会使"使用严格"的行为变得不必要或特别不受欢迎?
或者,Perl中的"使用严格"行为是否已被广泛采用?
注意:"必要"是指"实际必要",并非绝对必要.显然你可以在没有"use strict"的情况下编写Perl,但是(从我所见过的)大多数Perl程序员都会使用它.
注意:Python解释器包装器不需要 "使用严格"类似的约束 - 您可以使用类似于"use strict"的伪编译指示,这将被普通解释器忽略.我不是在谈论添加语言级功能.
更新:解释Perl每条评论中"use strict"的作用.(官方文档链接在第一段.)
"use strict"指令有三个不同的组件,其中只有两个非常有趣:
use strict vars:在程序中静态检查词法范围的变量用法.(请记住,在Python中,基本上只有global
范围和local
范围).许多Python短信检查这种事情.因为它是他们可以做的唯一的静态分析,所以直言不讳地假设你使用简单的词汇范围,并在你告诉他们闭嘴之前警告你那些看似错误的东西; 即
FOO = 12
foo += 3
Run Code Online (Sandbox Code Playgroud)
如果您没有对命名空间做任何想法,那么检查拼写错误就很有用.
use strict refs:防止符号命名空间解除引用.Python最接近的模拟是使用locals()
和globals()
进行符号绑定和标识符查找.
use strict subs:在Python中没有真正的模拟.
python compiler-construction perl static-analysis use-strict
为什么CPython(没有关于其他Python实现的线索)有以下行为?
tuple1 = ()
tuple2 = ()
dict1 = {}
dict2 = {}
list1 = []
list2 = []
# makes sense, tuples are immutable
assert(id(tuple1) == id(tuple2))
# also makes sense dicts are mutable
assert(id(dict1) != id(dict2))
# lists are mutable too
assert(id(list1) != id(list2))
assert(id(()) == id(()))
# why no assertion error on this?
assert(id({}) == id({}))
# or this?
assert(id([]) == id([]))
Run Code Online (Sandbox Code Playgroud)
我有一些想法可能,但找不到具体原因.
编辑
进一步证明格伦和托马斯的观点:
[1] id([])
4330909912
[2] x = []
[3] …
Run Code Online (Sandbox Code Playgroud) 可以not x
和x==None
给出不同的答案,如果x
是一个类的实例?
我的意思是如何not x
评估是否x
是一个类实例?
真的很简单的问题.
是什么区别:
if a.b is 'something':
Run Code Online (Sandbox Code Playgroud)
和
if a.b == 'something':
Run Code Online (Sandbox Code Playgroud)
请原谅我的无知
这两个蟒蛇成语有什么区别?
if data is not None:
return data
if data: return data
我无法理解为什么会发生这种情况..
看看这个python代码:
word = raw_input("Enter Word")
length = len(word)
if word[length-1:] is "e" :
print word + "d"
Run Code Online (Sandbox Code Playgroud)
如果我输入"爱",它的输出必须"被爱".所以,当我在PyScripter IDE中编写它时,它既不显示错误也不显示输出.但我在python shell中尝试了相同的代码,它的工作原理!
我想知道为什么会这样.
python ×7
cpython ×1
equality ×1
identity ×1
jython ×1
perl ×1
python-2.7 ×1
reference ×1
semantics ×1
use-strict ×1