Python"是"声明:发生了什么?

fjs*_*jsj 34 python

我很惊讶

[] is not []
Run Code Online (Sandbox Code Playgroud)

评估为True.

这段代码发生了什么?真的notis陈述在做什么?

Mar*_*ers 57

a is not b是一个特殊的运算符,相当于not a is b.

a is b如果a和b绑定到同一个对象,则运算符返回True,否则返回False.当您创建两个空列表时,您将获得两个不同的对象,因此is返回False(因此is not返回True).

  • *如果a和b是同一个对象* - 我希望*绑定到同一个对象*甚至更好. (8认同)

unh*_*ler 32

is 是身份比较.

== 是平等比较.

您的语句正在制作两个不同的列表,并检查它们是否是同一个实例,而不是它们.如果你使用==它将返回true,因为它们都是空列表.


Jia*_*aro 22

描述为什么会发生这种情况的最佳方式是:

这是你的例子

>>> x = []
>>> y = []
>>> print(x is y)
... False
Run Code Online (Sandbox Code Playgroud)

x并且y实际上是两个不同的列表,所以如果你添加一些东西x,它就不会出现y

>>> x.append(1)
>>> print(x)
... [1]
>>> print(y)
... []
Run Code Online (Sandbox Code Playgroud)

那么我们如何使(x is y)评估为真呢?

>>> x = []
>>> y = x
>>> print(x is y)
... True

>>> x.append(10)

>>> print(x)
... [10]
>>> print(y)
... [10]

>>> print(x is y)
... True
Run Code Online (Sandbox Code Playgroud)

如果你想看看两个列表是否有相同的内容......

>>> x = []
>>> y = []
>>> print(x == y)
... True

>>> x.append(21)

>>> print(x)
... [21]
>>> print(y)
... []

>>> print(x == y)
... False

>>> y = [21]
>>> print(x == y)
... True
Run Code Online (Sandbox Code Playgroud)

  • @Pithikos,因为你正在使用的特定版本的python中的优化,它不是一个保证.此外,字符串是不可变的,因此您无法更改其中一个值.您只能将新字符串分配给同一个变量. (4认同)

Sjo*_*erd 8

is手段是同一个实例.如果运算符任一侧的变量指向同一对象,则计算结果为true,否则为false.

参考,靠近底部.