为什么即使具有相同的值,python也会将新的id分配给list,tuples,dict?

时间:2016-02-18 09:42:38

标签: python

x1 = 5
y1 = 5
x2 = 'Hello'
y2 = 'Hello'
x3 = [1,2,3]
y3 = [1,2,3]
print(x1 is y1)
print(x2 is y2)
print(x3 is y3)

输出

True
True
False

为什么python为y3分配一个不同的id,而不是x3。
这里x3和y3是列表,python对元组和字典也一样,我也想知道python在哪里有相同的行为将新的id分配给具有相同值的变量,为什么会这样?

2 个答案:

答案 0 :(得分:4)

因为否则会发生这种情况:

 var docsView = new google.picker.DocsView().
                                 setIncludeFolders(true).
                                 setSelectFolderEnabled(true);
          var picker = new google.picker.PickerBuilder()
              .enableFeature(google.picker.Feature.MINE_ONLY)
              .enableFeature(google.picker.Feature.NAV_HIDDEN)
              .setAppId(appId)
              .setOAuthToken(oauthToken)
              .setDeveloperKey(developerKey)
              .addView(docsView)
              .setCallback(pickerCallback)
              .build();
          picker.setVisible(true);

事实上,

x3 = [1,2,3]
y3 = [1,2,3]

x3[0] = "foo"
x3[0] == y3[0] // Does NOT happen!

这是一件好事™。如果x3[0] != y3[0] x3相同,那么更改另一个也会改变另一个。这通常没有被发现。

另请参阅when does Python allocate new memory for identical strings?为什么字符串的行为不同。

另外,如果您想比较,请使用y3

答案 1 :(得分:3)

Tichodroma说得很好。但是,如果你想为列表,dicts等提供相同的id()(如果你想为同一个对象设置不同的名称),那么你可以这样做:

>>> x3 = y3 = [1,2,3]
>>> print(x3 is y3)
True

在这种情况下,x3和y3在内存中引用相同的列表对象。所以,如果你改变其中任何一个,另一个将会改变。

>>> x3[1] = 10
>>> y3
[1, 10, 3]
>>> x3
[1, 10, 3]

加成:

如果整数值相同,则它们并不总是具有相同的id。看看here

  

当前实现为所有实体保留了一个整数对象数组   -5到256之间的整数,当你在该范围内创建一个int时   实际上只是返回对现有对象的引用。

测试:

>>> n = 256
>>> m = 256
>>> n is m
True
>>> n = 257
>>> m = 257
>>> n is m
False
>>> 

另一个有趣的测试(去图!):

>>> 2**8 is 2**8
True
>>> 2**9 is 2**9
False

P.S。:我正在运行python 3.4。而文档中的引用是针对python 2.7的(我没有找到python 3.4的等价物)。但我仍然在python 3.4中获得类似的输出我正在运行。所以对于python 2.7来说,当前实现似乎对python 3.4仍然有效。