"is"关键字的类型可能等同于Python中的等于运算符

fma*_*ark 3 python identity reference immutability variable-assignment

对于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)

这提出了几个问题:

  1. ==/ is相关不变性等价?
  2. 上面列出的行为或实现细节是?
  3. 最重要的(并且基本上),我如何知道作业是否会导致正在制作的对象的副本,或者对它的引用?

更新:如果总是通过引用分配,为什么不打印以下内容2?:

>>> a = 1
>>> b = a
>>> a = 2
>>> b
1
Run Code Online (Sandbox Code Playgroud)

为什么这不等同于以下C片段:

int a = 1;
int *b = &a;
a = 2;
printf("%d\n", *b);
Run Code Online (Sandbox Code Playgroud)

对这个问题的新见事表示歉意,但我是一个Python新手,并认为理解这一点很重要.您是否有任何阅读建议您理解这些问题?

Fer*_*yer 9

is运营商的测试,如果两个物体在物理上是相同的,这意味着如果他们有在内存中的同一地址.这也可以使用以下id()功能进行测试:

>>> a = 1
>>> b = 1
>>> a is b
True
>>> id(a) == id(b)
True
Run Code Online (Sandbox Code Playgroud)

==另一方面,运营商,测试对语义平等.通过实现该__eq__()函数,也可以通过自定义类覆盖它.从语义上讲,如果两个不同的列表的元素全部相等,则它们是相等的,但在物理上它们将是不同的对象.

Python实现可能会汇集不可变类型(如字符串和元组),因此两个文字字符串对象实际上是物理上相同的.但这并不意味着您可以始终使用它is来比较这些类型,如以下示例所示:

>>> "foobar" is "foobar"   # The interpreter knows that the string literals are
True                       # equal and creates only one shared object.
>>> a = "foobar"
>>> b = "foobar"
>>> a is b        # "foobar" comes from the pool, so it is still the same object.
True
>>> b = "foo"     # Here, we construct another string "foobar" dynamically that is
>>> b += "bar"    # physically not the same as the pooled "foobar".
>>> a == b
True
>>> a is b
False
Run Code Online (Sandbox Code Playgroud)

Python中的赋值始终将对象的引用绑定到变量名,并且永远不会隐含副本.

UPDATE

类似于C,认为Python变量始终是指针:

>>> a = 1
>>> b = a
>>> a = 2
>>> b
1
Run Code Online (Sandbox Code Playgroud)

大致相当于:

const int ONE = 1;
const int TWO = 2;

int *a = &ONE;
int *b = a;  /* b points to 1 */
a = &TWO;    /* a points to 2, b still points to 1 */
Run Code Online (Sandbox Code Playgroud)


ken*_*ytm 7

== /是否与不变性相关?

没有.

请参阅Python'=='vs'是'比较字符串,'是'有时会失败,为什么?为什么它对字符串起作用,而Python"is"运算符对整数的行为意外地表示为什么它对整数起作用(因此出于同样的原因而起作用).

上面列出的行为或实现细节是?

实施细节.

我如何知道作业是否会产生正在制作的对象的副本,或者对它的引用?

作业总是通过参考.只有在明确使用copy.copy(或类似的东西)时才进行复制.

编辑:通过"引用"我不是指C++中的引用.Python的赋值将重新绑定变量.它更像是

// int* a, *b;
a = new int(1);
b = a;
a = new int(2);
printf("%d\n", *b);
Run Code Online (Sandbox Code Playgroud)