你好.我有一个关于Python何时以及何时使用引用的工作方式的问题.
我在这里有一个例子,我理解.
a = "cat"
b = a
a is b
True
Run Code Online (Sandbox Code Playgroud)
这是有道理的.但这里有一些我不明白的东西.
a = "cat"
b = "cat"
a is b
True
c = 1.2
d = 1.2
c is d
False
e = "cat"
f = "".join(a)
e is f
False
Run Code Online (Sandbox Code Playgroud)
为什么a是b返回True而不是c是d?这两种类型都是不变的吗?它在使用浮点数时起作用我只能想象它是某种优化,但我很高兴得到任何答案.
我也尝试了其他一些东西并得到了这个结果:
a = "cat"
b = "c"
c = b+"at"
a is c
False # Why not same as setting c = "cat"
d = "cat"+""
a is d …Run Code Online (Sandbox Code Playgroud) 可能重复:
Python中的字符串比较:is = = =
Python string interning 为什么使用'=='或'is'比较Python中的字符串
有时会产生不同的结果?
我偶然使用is和 ==字符串交替使用,但我发现并不总是一样的.
>>> Folder = "locales/"
>>> Folder2 = "locales/"
>>> Folder is Folder2
False
>>> Folder == Folder2
True
>>> File = "file"
>>> File2 = "file"
>>> File is File2
True
>>> File == File2
True
>>>
Run Code Online (Sandbox Code Playgroud)
为什么在一种情况下操作符可以互换而在另一种情况下不可以?
可能重复:
Python中的字符串比较:is = ==
algorithm = str(sys.argv[1])
print(algorithm)
print(algorithm is "first")
Run Code Online (Sandbox Code Playgroud)
我正在使用参数从命令行运行它first,那么为什么代码输出:
first
False
Run Code Online (Sandbox Code Playgroud) 有人可以向我解释这种行为吗?
a = 'Test'
b = 'Test'
print(a is b) # True
Run Code Online (Sandbox Code Playgroud)
我预计结果为 False,因为 a 和 b 是不同的引用。当使用相等运算符 (==) 来比较值相等时,我所期望的显示结果。
is-operator 是为了比较引用相等?还是我弄错了?
显示行为的原因是什么?
对于Python中的某些类型,is运算符似乎等同于==运算符.例如:
>>> 1 is 1
True
>>> "a spoon" is "a spoon"
True
>>> (1 == 1) is (2 == 2)
True
Run Code Online (Sandbox Code Playgroud)
然而,这并非总是如此:
>>> [] == []
True
>>> [] is []
False
Run Code Online (Sandbox Code Playgroud)
这对于诸如列表之类的可变类型是有意义的.但是,诸如元组之类的不可变类型似乎显示相同的行为:
>>> (1, 2) == (1, 2)
True
>>> (1, 2) is (1, 2)
False
Run Code Online (Sandbox Code Playgroud)
这提出了几个问题:
==/ is相关不变性等价? 更新:如果总是通过引用分配,为什么不打印以下内容2?:
>>> a = 1
>>> b = a
>>> a = 2
>>> b
1 …Run Code Online (Sandbox Code Playgroud) 我仍然是Python的新手.我听到有人说使用is,不是==因为"这不是C".但我有一些代码x is 5,它没有按预期工作.
因此,遵循正确的Python/PEP样式,何时使用is以及何时使用==?
根据python样式指南,python关键字is应该用于代替==运算符.
然而,它们并不总是与此处所示完全相同.为什么?实际差异是什么,适当的用法是什么?
import unittest
class testIS(unittest.TestCase):
def test_is(self):
self.assertEqual(1,1)
if __name__ == '__main__':
unittest.main()
Run Code Online (Sandbox Code Playgroud)
哪个有效...但以下不...
import unittest
class testIS(unittest.TestCase):
def test_is(self):
self.assertEqual(1,1)
if __name__ is '__main__':
unittest.main()
Run Code Online (Sandbox Code Playgroud) 如果我写这个:
if x == None:
x = 1
Run Code Online (Sandbox Code Playgroud)
我的pyCharm编辑器一直建议我应该使用'is'而不是'==':
if x is None:
x = 1
Run Code Online (Sandbox Code Playgroud)
对于任何其他相等检查,pyCharm不建议使用'is',如:
if x == 2:
x = 1
Run Code Online (Sandbox Code Playgroud)
为什么'is'操作'=='员在检查对象是否优先时优先于操作员None?
为什么它只适用于None?
如果我使用比较两个变量==,Python会比较身份,如果它们不相同,那么比较值?
例如,我有两个指向同一个字符串对象的字符串:
>>> a = 'a sequence of chars'
>>> b = a
Run Code Online (Sandbox Code Playgroud)
这是比较值,还是只比较ids?:
>>> b == a
True
Run Code Online (Sandbox Code Playgroud)
首先比较身份是有意义的,我想是这样的,但我还没有在文档中找到任何支持这一点的东西.我得到的最接近是这样:
x==y电话x.__eq__(y)
这并没有告诉我在打电话之前是否做了什么x.__eq__(y).
python ×10
identity ×2
immutability ×2
operators ×2
python-2.7 ×2
reference ×2
string ×2
syntax ×2
comparison ×1
keyword ×1
nonetype ×1
pycharm ×1