【发布时间】:2011-03-14 04:42:59
【问题描述】:
对于 Python 中的某些类型,is 运算符似乎等同于 == 运算符。例如:
>>> 1 is 1
True
>>> "a spoon" is "a spoon"
True
>>> (1 == 1) is (2 == 2)
True
但是,情况并非总是如此:
>>> [] == []
True
>>> [] is []
False
这对于诸如列表之类的可变类型是有意义的。但是,元组等不可变类型似乎表现出相同的行为:
>>> (1, 2) == (1, 2)
True
>>> (1, 2) is (1, 2)
False
这引发了几个问题:
-
==/is等价性是否与不变性有关? - 上面的行为是指定的还是实现细节?
- 最重要的是(并且基本上),我如何知道分配是否会导致生成对象的副本或对其进行引用?
更新:
如果赋值总是通过引用,为什么下面的不打印2?:
>>> a = 1
>>> b = a
>>> a = 2
>>> b
1
为什么这不等价于下面的 C sn-p:
int a = 1;
int *b = &a;
a = 2;
printf("%d\n", *b);
对于这个问题的新奇表示歉意,但我是 Python 新手,觉得理解这一点很重要。你有什么推荐的读物来理解这些问题吗?
【问题讨论】:
标签: python reference identity variable-assignment immutability